Spring Cloud | 第二篇: 服務消費

 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,看到控制檯打印如下信息,說明服務調用成功



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章