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包傲慢的丢给他,让他自己去调用吧。等等好像差点什么,接口文档怎么办?下一篇再写接口文档吧。。。。。。

 

posted @ 2021-02-23 15:46  shileishmily  阅读(421)  评论(0编辑  收藏  举报