zoukankan      html  css  js  c++  java
  • Spring Cloud 之 Feign Client优雅调用(七)

    上一篇讲了Feign Client调用,但是不够优雅,一个互联网公司往往有几十个,甚至上百个微服务,如果都通过下面的方式调用,我们可能要封装上千个接口。而且服务提供者升级接口时,消费端也要修改代码。那么有没有这样一种方式,服务提供者提供一个API包出来,消费者只需要引入这个API包,就能像Dubbo调用本地服务一样便捷呢。当然。。。

    1 /**
    2  * @author Leo
    3  */
    4 @FeignClient(value = "x-demo-service")
    5 public interface FeignClientDemoService {
    6 
    7     @RequestMapping(value = "demo/service", method = RequestMethod.GET)
    8     String service();
    9 }

    1、新建一个module名称为x-demo-service-api的模块

    2、定义接口类

    1 @RequestMapping("demo-api")
    2 public interface ServiceDemoApi {
    3 
    4     @PostMapping("sayHello")
    5     BaseResponse sayHello(@RequestBody BaseRequest request);
    6 }
    BaseRequest类
    1 /**
    2  * @author Leo
    3  */
    4 @Data
    5 public class BaseRequest<T> implements Serializable {
    6     private String uuid;
    7 
    8     private T data;
    9 }
    BaseResponse类
     1 /**
     2  * @author Leo
     3  */
     4 @Data
     5 public class BaseResponse<T> implements Serializable {
     6     private String code;
     7 
     8     private String message;
     9 
    10     private T data;
    11 }

    3、因为x-demo-service-api只是一个接口定义服务,供服务提供者和服务消费者依赖使用,所以x-demo-service-api没有启动类,也没有任何配置,到此x-demo-service-api就已经OK了

    4、x-demo-service提供者改造

    首先修改gradle配置文件,增加对x-demo-service-api依赖

    1 dependencies {
    2     compile project(":x-demo-service-api")
    3 
    4     compile("org.springframework.cloud:spring-cloud-starter-netflix-eureka-client")
    5 }

    新建一个Controller,该Controller要实现我们在x-demo-service-api中定义的ServiceDemoApi接口

     1 /**
     2  * @author Leo
     3  */
     4 @RestController
     5 @Slf4j
     6 public class DemoApiProviderController implements ServiceDemoApi {
     7 
     8     @Value("${server.port}")
     9     String port;
    10 
    11     @Override
    12     public BaseResponse sayHello(BaseRequest request) {
    13         BaseResponse response = new BaseResponse();
    14         response.setCode("0000");
    15         response.setMessage("success");
    16         response.setData("ServiceDemoApi: " + port);
    17         return response;
    18     }
    19 }

    5、x-demo-service-feign服务消费者改造

    同样gradle配置文件增加对x-demo-service-api的依赖

    1 dependencies {
    2     compile project(":x-demo-service-api")
    3 
    4     compile("org.springframework.cloud:spring-cloud-starter-netflix-eureka-client")
    5     compile("org.springframework.cloud:spring-cloud-starter-openfeign")6 }

    然后新建一个DemoApiClient接口,该接口继承我们在x-demo-service-api中定义的ServiceDemoApi接口,并为其加上注解@FeignClient(value = "x-demo-service")

    @FeignClient(value = "x-demo-service")
    public interface DemoApiClient extends ServiceDemoApi {
    
    }

    新建一个Controller类DemoApiConsumerController,第5行注入DemoApiClient接口,第11行就行调用本地方法一样调用远程服务。

     1 @RestController
     2 @RequestMapping("feign/api")
     3 public class DemoApiConsumerController {
     4     @Autowired
     5     private DemoApiClient demoApiClient;
     6 
     7     @RequestMapping(value = "service", method = RequestMethod.GET)
     8     public BaseResponse service() {
     9         BaseRequest request = new BaseRequest();
    10         request.setUuid("123");
    11         return demoApiClient.sayHello(request);
    12     }
    13 }

    6、验证

    x-demo-service和x-demo-service-feign改造完成,我们依次重启。在浏览器中输入:http://localhost:8092/feign/api/service,观察返回报文。

    至此, x-demo-service-api演示结束,以后别人再找我们对接接口,你就可以把x-demo-service-api打成jar包傲慢的丢给他,让他自己去调用吧。等等好像差点什么,接口文档怎么办?下一篇再写接口文档吧。。。。。。

  • 相关阅读:
    java-并发解决方案
    linux-常用快捷键
    java-进程
    vim-常用快捷键
    数据库-事务
    spring-事务实现原理
    gdb
    x86 下的 struct 變數 member 擺放位置
    du 查看 資料夾 佔用空間
    ADC 計算時,階數的選擇
  • 原文地址:https://www.cnblogs.com/shileibrave/p/14436460.html
Copyright © 2011-2022 走看看