一开始,我们使用原生的 DiscoveryClient 发现服务和使用RestTemplate进行服务间调用,然后我们自己手动开发了一个负载均衡组件,最后介绍了负载均衡组件Ribbon。每个章节调用服务的方式也有所不同,共同点则是都是基于RestTemplate 来实现的,想必大家都会觉得这样的调用方式有点麻烦,每次调用前都要写请求协议,服务名称,接口名称、组装参数、处理响应数据类型,这些都是一些重复的工作,代码也都高度相似,每次请求只有 URL 不同,请求方法不同、参数不同,其它东西基本都是一样的,既然如此,那有没有办法简化请求呢?本文我们要聊的声明式微服务调用OpenFeign 。
OpenFeign是一个显示声明式的WebService客户端。使用OpenFeign能让编写Web Service客户端更加简单。使用时只需定义服务接口,然后在上面添加注解。OpenFeign也支持可拔插式的编码和解码器。spring cloud对feign进行了封装,使其支持MVC注解和HttpMessageConverts。和eureka(服务注册中心)和ribbon组合可以实现负载均衡。在Spring Cloud中使用OpenFeign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求,非常的方便
接下来,就开始我们的项目实战,创建两个服务,一个是dms(就是码表服务,提供各种下拉选项列表),一个是应用系统app(实际的业务系统)
首先创建名为dms的maven项目,引入依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies>
创建配置文件:
server:
port: 8003
spring:
application:
name: dms
eureka:
client:
service-url:
defaultZone: http://localhost:8001/eureka/
logging:
pattern:
console: '%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} - %msg%n'
编写启动类
@EnableDiscoveryClient @EnableFeignClients @EnableEurekaClient @SpringBootApplication public class DmsApplication { public static void main(String[] args) { SpringApplication.run(DmsApplication.class, args); } }
注意此时,我们在启动类上面增加了@EnableFeignClients和@EnableDiscoveryClient注解。
编写api模块代码,注意这是一个接口对外提供服务,接口的服务名称是dms,根据code代码值获取名称:
@FeignClient(value = "dms") public interface DmsApi { @RequestMapping(value="/dict/[code]", method = RequestMethod.GET) public String findNameByCode(@PathVariable("code") String code); }
编写controller类,可以实现DmsApi接口,这里简单以性别举例:
@RestController public class DmsController implements DmsApi { @Override public String findNameByCode(String code) { switch (code){ case "0" : return "男"; case "1" : return "女"; default: return "未知"; } } }
dms模块就开发完毕了。
同样的,创建app模块,注意需要引入dms模块,以便调用其接口
<dependencies> <dependency> <groupId>com.cxy965</groupId> <artifactId>dms</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </dependency> </dependencies>
创建controller层:在此注入dmsApi,并通过dmsApi调用其findNameByCode()方法,即可完成服务的调用代码!
@RestController public class AppController { @Autowired private DmsApi dmsApi; @RequestMapping("/index") public String index(){ String nameByCode = dmsApi.findNameByCode("1"); return nameByCode; } }
启动类
@EnableEurekaClient @SpringBootApplication public class AppApplication { public static void main(String[] args) { SpringApplication.run(AppApplication.class, args); } }
返回了正确的结果,当注册中心有多个dms服务时,调用时会自动起到负载均衡的作用。
OpenFeign 是 Spring Cloud 家族的一个成员, 它最核心的作用是为 HTTP 形式的 Rest API 提供了非常简洁高效的 RPC 调用方式。 如果说 Spring Cloud 其他成员解决的是系统级别的可用性,扩展性问题, 那么 OpenFeign 解决的则是与开发人员利益最为紧密的开发效率问题。这篇文章中我们学会了Feign组件的集成和基础使用,下一篇文章将写一下Feign的更多用法,一起期待吧!