SpringCloud服務間的調用有兩種方式:RestTemplate和FeignClient。不管是什麼方式,他都是通過REST接口調用服務的http接口,參數和結果默認都是通過json序列化和反序列化。因爲Spring MVC的RestController定義的接口,返回的數據都是通過Json序列化成JSON數據。
此文章基於上一篇文章的工程
使用RestTemplate進行服務消費
一:編寫服務提供者
我們在Mall_WechatService模塊編寫服務提供者,有三個mapping分別提供get請求,post請求接收json格式的字符串,post請求接收map格式的數據
@Controller
public class ProduceHelloController {
private final Logger logger= LoggerFactory.getLogger(this.getClass());
//get請求
@ResponseBody
@RequestMapping("/helloA")
public String sayHelloA(){
Map<String,Object> map = new HashMap<String,Object>();
map.put("name","king james");
map.put("age",33);
map.put("team","Cleveland Cavaliers");
logger.info(JSON.toJSONString(map));
return JSON.toJSONString(map);
}
//POST請求發送json格式的數據
@ResponseBody
@RequestMapping("/helloB")
public String sayHelloB(@RequestBody(required = false)String requestJson){
try{
JSONObject jsonObject = JSON.parseObject(requestJson);
logger.info("helloB"+requestJson);
return requestJson;
}
catch (Exception e){
logger.info("發生了異常:"+e.getMessage());
return "error";
}
}
//POST請求用Map接收
@ResponseBody
@RequestMapping("/helloC")
public String sayHelloC(@RequestBody Map<String, Object> params){
try{
logger.info("helloC"+JSON.toJSONString(params));
return JSON.toJSONString(params);
}
catch (Exception e){
logger.info("發生了異常:"+e.getMessage());
return "error";
}
}
}
二:編寫服務消費者
我們在Mall_ManagerService模塊編寫服務消費者,分別對應上面的三個請求
首先編寫RestTemplate的配置
@Configuration
public class ResTemplateConfig {
@Bean
//加上這個標籤會有負載均衡的效果
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
}
編寫消費的controller
@Controller
public class HelloController {
private final Logger logger= LoggerFactory.getLogger(this.getClass());
@Autowired
private RestTemplate restTemplate;
String host = "http://mall-wechatservice";//Mall_WechatService模塊的spring.application.name
@ResponseBody
@RequestMapping("/sayHelloA")
public String getInfoFromWechatA(){
String url = host+"/helloA";
String text = restTemplate.getForObject(url,String.class);
logger.info("text:"+ text);
return text;
}
@ResponseBody
@RequestMapping("/sayHelloB")
public String getInfoFromWechatB(){
String url = host+"/helloB";
Map<String,Object> map = new HashMap<String,Object>();
map.put("name","king james");
map.put("age",33);
map.put("team","Cleveland Cavaliers");
String text = restTemplate.postForObject(url,JSON.toJSONString(map),String.class);
logger.info("text:"+ text);
return text;
}
@ResponseBody
@RequestMapping("/sayHelloC")
public String getInfoFromWechatC(){
String url = host+"/helloC";
Map<String,Object> map = new HashMap<String,Object>();
map.put("name","king james");
map.put("age",33);
map.put("team","Cleveland Cavaliers");
String text = restTemplate.postForObject(url,map,String.class);
logger.info("text:"+ text);
return text;
}
}
我們請求服務消費者的三個URL,然後可以看到Mall_WechatService模塊能夠正確提供信息並且返回,下面是打印信息
使用Feign進行服務消費
編寫服務消費者
首先導入Feign的pom依賴文件,這裏一定要注意的是,在SpringCloud最新版本,基於SpringBoot2.0+版本當中,feign的依賴是:
<!--項目使用Feign作爲Rest客戶端進行遠程調用,Spring Cloud版本升級後,Feign依賴變更爲:-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在舊的版本當中,則引入如下依賴:
<!--老版本的springcloud當中的feign依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
在主類上面加上@EnableFeignClients註解開啓Feign的功能
@EnableEurekaClient
@SpringBootApplication
@EnableFeignClients
public class MallManagerServiceApplication {
public static void main(String[] args) {
SpringApplication.run(MallManagerServiceApplication.class, args);
}
}
編寫feign接口,調用服務
//括號裏面就是你要調用服務的spring.application.name的值
//在這裏,我需要去調用mall_wechatservice當中的hello服務
@FeignClient("mall-wechatservice")
public interface HelloServiceRestful {
/**
* 請求mall_wechatservice模塊的helloA
* @return
*/
@RequestMapping("/helloA")
public String getInfoFromWechatA();
/**
* 請求mall_wechatservice模塊的helloB
* @return
*/
@RequestMapping("/helloB")
public String getInfoFromWechatB(@RequestBody String json);
/**
* 請求mall_wechatservice模塊的helloC
* @return
*/
@RequestMapping("/helloC")
public String getInfoFromWechatC(@RequestBody Map<String, Object> params);
}
定義controller,調用服務
@Controller
public class FeignHelloController {
private final Logger logger= LoggerFactory.getLogger(this.getClass());
@Autowired
private HelloServiceRestful helloServiceRestful;
@ResponseBody
@RequestMapping("sayFeignHello")
public String getInfoFromWechat(){
String text = helloServiceRestful.getInfoFromWechatA();
logger.info("A"+text);
Map<String,Object> map = new HashMap<String,Object>();
map.put("name","king james");
map.put("age",33);
map.put("team","Cleveland Cavaliers");
text = helloServiceRestful.getInfoFromWechatB(JSON.toJSONString(map));
logger.info("B"+text);
text = helloServiceRestful.getInfoFromWechatC(map);
logger.info("C"+text);
return text;
}
}
我們輸入http://localhost:8011/sayFeignHello,看到控制檯打印如下信息,說明服務調用成功