上个文章使用了Eureka搭建了集群服务注册中心,但是最后实现 RPC 的方式还是  从代码中获得服务对应地址->字符串拼接->请求获得响应  的这样一种方式。

这种方式弊端还是有不少的。如果可以像调用自己的服务一样调用别人提供的服务那该多舒适啊。

 

而 Feign 就可以实现这种需求,Feign也是网飞开发的,SpringCloud 使用 Feign 非常简单,我下边演示一下:

首先 服务消费者这边肯定需要一个对应的依赖:

需要启用Feign的话,也得在启动类上面加个注解 @EnableFeignClients

然后,创建一个 Feign 的接口,像这样子

@FeignClient 注解里边的默认属性,也就是name属性是一个客户端的名字,如果使用了Eureka的话,会给他自动解析为 Eureka Server 服务注册表中的服务。

要是配了Ribbon,也会使用默认的负载均衡策略来执行请求。

Feign默认使用SpringMVC的注解声明请求,当然也可以用Feign自带的注解。不过没啥必要,还需要配置东西。

 

我上边这个例子写完了,实际使用的话只需要注入该类然后调用对应的方法就完事了。非常简便。

不过有几个点需要注意

在使用@FeignClient 声明的Feign伪装类中:

使用 @PathVariable 注解,必须加上参数!

GET请求无法使用对象作为入参! 要不有多少参数写多少参数(每个都要加@RequestParam(“参数名”) 注解),要不就用接受一个Map对象,也得加@RequestParam

POST请求可以接收对象,需要加上@RequestBody注解

 

 

Feign论使用的话,其实已经差不多了。

但是还有一些相关的操作也比较重要。

 

Feign 的请求都是使用的默认配置,我们其实可以实现自己的配置供 Feign 使用以实现编码、解码、日志记录、验证 等等等等。

比如我可以这么定义一个配置类:

该类配置了对应的日志记录器,和一个简单的效验,以应对请求的验证。

在对应的Feign伪装类中,上边的@FeignClient注解改一下,就可以使用自己写的配置:

之所以在 @FeignClient 注解中指定配置,是因为我的配置类是没有加 @Configuration 注解的,我想要实现细粒度的控制。 推荐这样做。

如果加了@Configuration 注解,则 Spring 会将其自动解析自动应用到全局,这样子就不方便为每个请求进行细粒度调整。

 

 

阅读全文

上一篇 Spring Cloud 项目的搭建文章 : 链接

 

再说下我的版本号 , 用的比较新:

 

Spring Boot 2.0.5 RELEASE

Spring Cloud Finchley.SR3

项目管理工具: gradle


进入正题:

从之前的项目构造来看,RPC虽然是实现了,但是调用的链接确是写死在代码中的,比较丑陋。

要是提供服务的地址突然换了,那这边消费者直接雪崩,只能更改代码重新部署。而且无法实现负载均衡,这在一个微服务架构中是很不合理的。

要解决这问题,作为服务消费者,必须要有一个牛逼的服务发现机制。

Spring Cloud 就提供了多种服务发现组件的支持。Eureka、ZooKeeper 等,我这就用 Eureka 了, 在 Spring Cloud 这个生态圈里Eureka是比较流行的。

Eureka是网飞(Netflix)开源的服务发现组件。有Server和Client两部分,按需使用就行,我这就使用他们来构建一个高可用的服务注册中心。

 

我先把之前父模块的的Mybatis、mysql依赖给去了,放到了实际的微服务中(user/movie)。因为Eureka服务不需要这几个依赖,要是加载了mysql依赖会自动连接mysql,不加mysql的配置就会报一堆错误。

 

既然 Eureka 也是个服务,那当然也得在父模块下创建一个Eureka子模块。和其余的模块创建相同,没什么好说的。

给 Eureka 服务注册中心模块加上这个 Eureka Server 依赖

compile(“org.springframework.cloud:spring-cloud-starter-netflix-eureka-server“)

然后在 Eureka 服务的入口 java 文件上加上该注解 @EnableEurekaServer , 这个Application就是完全体了。

 

此时可以在网页里通过 ip:port 来访问页面,可以得知注册中心的状态、多少服务链接到本机。