博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
疯狂Spring Cloud连载(14)Spring Cloud整合Feign
阅读量:6763 次
发布时间:2019-06-26

本文共 4114 字,大约阅读时间需要 13 分钟。

hot3.png

本文节选自《疯狂Spring Cloud微服务架构实战》

京东购买地址:

当当网购买地址:

Spring Cloud教学视频:

Spring Cloud电子书:

Spring Cloud整合Feign

        前面讲解了Feign的使用,在了解如何单独使用Feign后,再学习Spring Cloud中使用Feign,将会有非常大的帮助。虽然Spring Cloud对Feign进行了封装,但万变不离其宗,只要了解其内在原理,使用起来就可以得心应手。

        在开始本小节前,先准备Spring Cloud的测试项目。测试案例主要有以下三个项目:

  • spring-feign-server:Eureka服务器端项目,端口为8761,代码目录为codes\05\5.3\spring-feign-server。
  • spring-feign-provider:服务提供者,代码目录为codes\05\5.3\spring-feign-provider,该项目可以在控制台中根据输入的端口号启动多个实例,本小节启动8080与8081这两个端口,该项目提供以下两个REST服务:
    • 第一个地址为“/person/{personId}”,请求后返回Person实例,Person的message属性为HTTP请求的URL。
    • 第二个地址为“/hello”的服务,返回“Hello World”字符串。
  • spring-feign-invoker:服务调用者项目,对外端口为9000,代码目录codes\05\5.3\spring-feign-invoker,本小节例子主要在该项目下使用Feign。

Spring Cloud整合Feign

        为服务调用者(spring-feign-invoker)的pom.xml文件加入以下依赖:

org.springframework.cloud
spring-cloud-starter-feign

        在服务调用者的启动类中,打开Feign开关,请见代码清单5-18。

        代码清单5-18:

        codes\05\5.3\spring-feign-invoker\src\main\java\org\crazyit\cloud\InvokerApplication.java

@SpringBootApplication@EnableEurekaClient@EnableFeignClientspublic class InvokerApplication {	public static void main(String[] args) {		SpringApplication.run(InvokerApplication.class, args);	}}

        接下来,编写客户端接口,与直接使用Feign类似,代码清单5-19为服务端接口。

        代码清单5-19:

        codes\05\5.3\spring-feign-invoker\src\main\java\org\crazyit\cloud\PersonClient.java

@FeignClient("spring-feign-provider") //声明调用的服务名称public interface PersonClient {		@RequestMapping(method = RequestMethod.GET, value = "/hello")	String hello();}

        与单独使用Fiegn不同的是,接口使用了@FeignClient注解来修饰,并且声明了需要调用的服务名称,本例的服务提供者名称为“spring-feign-provider”。另外,接口方法使用了@RequestMapping来修饰,根据5.2.7章节可知,通过编写“翻译器(Contract)”,可以让Feign知道第三方注解的含义,Spring Cloud也提供翻译器,会将@RequestMapping注解的含义告知Feign,因此我们的服务接口就可以直接使用该注解。

        除了方法的@RequestMapping注解外,默认还支持@RequestParam、@RequestHeader、@PathVariable这3个参数注解,也就是说,在定义方法时,可以使用方式定义参数:

@RequestMapping(method = RequestMethod.GET, value = "/hello/{name}")	String hello(@PathVariable("name") String name);

        需要注意的是,使用了Spring Cloud的“翻译器”后,将不能再使用Feign的默认注解。接下来,在控制器中调用接口方法,请见代码清单是5-20。

        代码清单5-20:

        codes\05\5.3\spring-feign-invoker\src\main\java\org\crazyit\cloud\InvokerController.java

@RestController@Configurationpublic class InvokerController {	@Autowired	private PersonClient personClient;		@RequestMapping(value = "/invokeHello", method = RequestMethod.GET)	public String invokeHello() {		return personClient.hello();	}}

        在控制器中,为其注入了PersonClient的bean,不难看出,客户端实例的创建及维护,Spring容器都帮我们实现了。查看本例的效果,请按以下步骤操作:

  • 启动Eureka服务器(spring-feign-server)。
  • 启动两个服务提供者(spring-feign-provider),控制台中分别输入8080与8081端口。
  • 启动一个服务调用者(spring-feign-invoker),端口为9000。
  • 在浏览器中输入:,可以看到服务提供者的“/hello”服务被调用。

Feign负载均衡

        在前面章节,我们尝试过编写自定义的Feign客户端,在Spring Cloud中,同样提供了自定义的Feign客户端。可能大家已经猜到,如果结合Ribbon使用,Spring Cloud所提供的客户端,会拥有负载均衡的功能。

        Spring Cloud实现的Feign客户端,类名为LoadBalancerFeignClient,在该类中,维护着与SpringClientFactory相关的实例,通过SpringClientFactory可以获取负载均衡器,负载均衡器会根据一定的规则来选取处理请求的服务器,最终实现负载均衡的功能。接下来,调用“服务提供者”的“/person/{personId}”服务来测试负载均衡。为客户端接口添加内容,请见代码清单5-21。

        代码清单5-21:

        codes\05\5.3\spring-feign-invoker\src\main\java\org\crazyit\cloud\PersonClient.java

@RequestMapping(method = RequestMethod.GET, value = "/person/{personId}")	Person getPerson(@PathVariable("personId") Integer personId);

        为“服务调用者”的控制器添加方法,请见代码清单5-22。

        代码清单5-22:

@RequestMapping(value = "/router", method = RequestMethod.GET, 			produces = MediaType.APPLICATION_JSON_VALUE)	public String router() {		// 调用服务提供者的接口		Person p = personClient.getPerson(2);		return p.getMessage();	}

        运行“服务调用者”,在浏览器中输入:,进行刷新,可以看到8080与8081端口被循环调用。

默认配置

        Spring Cloud为Feign的使用提供了各种默认属性,例如前面讲到的“注解翻译器(Contract)”、Feign客户端,默认情况下,Spring将会为Feign的属性提供了以下的Bean:

  • 解码器(Decoder):bean名称为feignDecoder,ResponseEntityDecoder类,
  • 编码器(Encoder):bean名称为feignEecoder,SpringEncoder类。
  • 日志(Logger): bean名称为feignLogger,Slf4jLogger类。
  • 注解翻译器(Contract): bean名称为feignContract,SpringMvcContract类。
  • Feign实例的创建者(Feign.Builder):bean名称为feignBuilder,HystrixFeign.Builder类。Hystrix框架将在后面章节中讲述。
  • Feign客户端(Client):bean名称为feignClient,LoadBalancerFeignClient类。

        一般情况下,Spring提供的这些Bean已经足够我们使用,如果有些更特殊的需求,可以实现自己的Bean,请见后面章节。

本文节选自《疯狂Spring Cloud微服务架构实战》

Spring Cloud教学视频:

Spring Cloud电子书:

本书代码共享地址:

140509_5TSO_3665821.png

转载于:https://my.oschina.net/JavaLaw/blog/1557876

你可能感兴趣的文章
函数计算性能福利篇(二) —— 业务冷启动优化
查看>>
Python学习之路25-使用一等函数实现设计模式
查看>>
macOS 10 13 Cocoapods 命令错误
查看>>
Swift3中的 Method Swizzling
查看>>
BroadcastReceive简介
查看>>
知乎 node事件机制 转载
查看>>
学习JavaScript数据结构与算法 (一)
查看>>
vue预渲染prerender-spa-plugin解决首屏白屏问题
查看>>
生产系统 SQL 执行异常原因分析
查看>>
【CSS基础】--居中的方式总结
查看>>
关于app的登录退出内容
查看>>
基于 Laravel 的模块化开发框架 Notadd RC1 fix1 发布
查看>>
模拟new实现
查看>>
30分钟理解GraphQL核心概念
查看>>
git 的常用命令
查看>>
Nacos v0.7.0:对接CMDB,实现基于标签的服务发现能力
查看>>
阿里巴巴AI夺肝结节诊断两项世界冠军,至今无人超越
查看>>
Java架构-(四)整合spring cloud云服务架构 - 企业分布式微服务云架构构建
查看>>
【译】终极指南:变量提升、作用域和闭包
查看>>
库克正名最贵iPhone:没有比X系列更好用的手机了
查看>>