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