springboot负载均衡Feign
git地址
https://github.com/a18792721831/studySpringCloud
1. 创建 Feign
2. 配置gradle
repositories {
maven{
url 'https://maven.aliyun.com/'
}
maven{
url 'http://maven.aliyun.com/nexus/content/groups/public/'
}
maven{
url 'https://repo1.maven.org/maven2/'
}
mavenCentral()
}
3. Feign配置
server:
port: 8000
eureka:
client:
# register-with-eureka: false
# fetch-registry: false
service-url:
defaultZone: http://127.0.0.1:8761/eureka/
logging:
level:
org:
springframework:
web:
servlet:
mvc:
method:
annotation:
RequestMappingHandlerMapping: trace
spring:
freemarker:
template-loader-path: classpath:/templates/
prefer-file-system-access: false
application:
name: eureka-feign-client
4. 开启Feign
在SpringbootfeignApplication类增加注解
EnableFeignClients–开启Feign
EnableEurekaClient–开启Eureka
5. 创建Feign配置
6. 创建FeignDao
其中,
EUREKA-CLIENT表示eureka-client服务提供者的服务名字
FeignConfig.class指定Feign的配置
注意:
1.这是接口
2.GetMapping中是Eureka-client服务提供者暴露的接口的url请求地址
说明:
我个人比较喜欢将Feign定位于Dao层,当然Service层也可。
7. 创建FeignService
8. 创建FeignController
9. 启动&验证
首先启动eureka-server
接着启动eureka-client服务提供者(多实例启动)
最后启动feign-client服务消费者
全部启动后是5个实例
访问eureka-server的主面板
接着验证eureka-client服务提供者的接口
然后请求feign的接口
发现其效果与Ribbon一致,都是轮询访问的。
10. Feign与Ribbon的关系
从github看,Feign维护很好,Issues处理比较及时。
而且从readme中看,feign的计划什么的都有,且分短期、中期和长期计划
而且给的例子也很多。赞。
从Feign的jar包依赖看
其依赖了ribbon.
对于Feign有书上是这样介绍的
Feign 受 Retrofit、JAXRS-2.0 和 WebSocket 的影响,采用了声明式 API 接口的风格,将Java Http 客户端绑定到它的内部。Feign 的首要目标是将JavaHttp客户端调用过程变得简单。Feign 的源码地址:https://github.com/OpenFeign/feign.
所以可以看到Feign的重点应该不是实现与Ribbon相同的功能,而是在Ribbon的基础上开发新的功能的。
11. FeignClient
我们在FeignDao上加上FeignClient注解的
注解的属性:
看到了与Ribbon有关的包
- FeignClient 注解被@Target(ElementType.TYPE)修饰,表示 FeignClient 注解的作用目标在接口上。
- @Retention(RetentionPolicv.RUNITINF)注解表明该注解会在Class字节码文件中存在,在运行时可以通过反射获取到。
- @Documented 表示该注解将被包含在 Javadoc中。
- @FeignClient 注解用于创建声明式API接口,该接口是RESTful风格的。Feign被设计成插拔式的,可以注入其他组件和Feign一起使用。最典型的是如果Ribbon可用,Feign会和Ribbon 相结合进行负载均衡。
- value()和 name()一样,是被调用的服务的ServiceId。
- url()直接填写硬编码的Url 地址。
- decode404即404是被解码,还是抛异常。
- configuration()指明FeignClient的配置类,默认的配置类为FeignClientsConfiguration类,在缺省的情况下,这个类注入了默认的 Decoder、Encoder 和 Contract 等配置的 Bean。
- fallback()为配置熔断器的处理类。
12. FeignClient配置
Feign Client 默认的配置类为 FeignClientsConfiguration,这个类在 spring-cloud-netflix-core的jar包下。
打开这个类,可以发现这个类注入了很多Feign相关的配置Bean,包括FeignRetryer、FeignLoggerFactory 和FormattingConversionService 等。
另外,Decoder、Encoder 和 Contract这3个类在没有Bean被注入的情况下,会自动注入默认配置的Bean,即ResponseEntityDecoder、SpringEncoder 和 SpringMvcContract。
默认注入的配置如下。
- Decoder feignDecoder:ResponseEntityDecoder。
- Encoder feignEncoder:SpringEncoder
- Logger feignLogger:SIf4jLogger。
- Contract feignContract:SpringMvcContract。
- Feign.Builder feignBuilder:HystrixFeign.Builder。
- FcignClientsConfiguration 的配置类部分代码如下,
- @ConditionalOnMissingBean 注解表示如果没有注入该类的Bean就会默认注入一个Bean。