随着服务注册中心的安装完成后,客户端的负载均衡和服务的调用又是我们关注的话题。Ribbon可以实现客户端的负载均衡,而OpenFeign则是可以让我们像调用Dubbo接口一样,实现面向接口编程
负载均衡LB
Load Balance(负载均衡):简单的说就是将用户的请求平摊的分配到多个服务器上,从而达到系统的HA(高可用)。常见的负载均衡工具有nginx、LVS,硬件上F5等
集中式LB
即在服务的消费方和提供方之间使用独立的LB设施,可以是硬件F5、也可以是软件nginx、LVS等,提供该设施将请求通过某种策略发送给服务提供方
进程内LB
将LB逻辑集成到消费方,消费方从服务注册中心查找服务列表,然后获取服务地址根据某种规则选出合适的服务器。Ribbon就是进程内LB,它只是一个类库,集成于消费方进程,消费者通过它来获取到服务提供方的地址
SpringCloud Ribbon是基于Netflix Ribbon实现的一套客户端的负载均衡工具,主要功能是提供了客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供了一系列完善的配置项例如连接超时、重试等。Ribbon目前也进入了维护模式
版本选择
SpringCloud版本依赖于SpringBoot的版本,可以从官网查询相关版本依赖关系:spring.io/projects/sp…
springboot 2.2.5.RELEASE
springcloud Hoxton.SR3
org.springframework.cloud
spring-cloud-starter-netflix-ribbon-client
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
org.springframework.boot
spring-boot-devtools
runtime
true
IRule:根据特点算法从服务列表中选取一个要访问的服务
Ribbon默认的负载均衡算法是轮询RoundRobinRule
该配置类不能防止在主启动类的子包下,否则该类就会被所有Ribbon客户端共享,达不到定制化目的
@Configuration
public class MyLoadBalance {
@Bean
public IRule myRule() {
return new RandomRule();
}
}
复制代码
修改某个微服务的负载均衡配置
// 使用@RibbonClient注解,name属性:服务名称,configuration:自定义的Irule实现类
@SpringBootApplication
@EnableEurekaClient
// 自定义某个微服务的负载均衡规则,使用@RibbonClient注解,将configuration属性中的@Configure去掉,不注入到spring容器中
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = {MyLoadBalance.class})
public class OrderMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderMain80.class, args);
}
}
Nginx是服务器端的负载均衡,客户端的所有请求都会交给nginx,由nginx分发到各个服务器上。即负载均衡是由服务端实现的 Ribbon是本地的负载均衡,在调用微服务接口的时,会在注册中心上获取注册服务信息列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用的技术
Feign是一个声明式的WebService客户端。使用Feign可以让编写WebService客户端更加便捷。它的使用方法是定义一个服务接口然后添加相关注解,OpenFeign支持SpringMVC标准注解和HttpMessageConverters。Feign默认结合了Ribbon,支持负载均衡
Feign
Feign是Spring Cloud组件中的一个轻量级Restful的HTTP服务客户端,Feign内置了Ribbon,用来做客户端的负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解接口,调用这个接口,就可以调用服务注册中心的服务
OpenFeign
OpenFeign是Spring Cloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理产生实现类,实现类中做负载均衡并调用其他服务
公共模块中添加接口方法
// name属性:微服务名
@FeignClient(name = "cloud-payment-service")
public interface PaymentService {
// 服务提供者端的配置
@GetMapping("/payment/get/{id}")
public CommonResult getById(@PathVariable("id") Integer id);
@GetMapping("/payment/timeout")
public String timeout();
}
添加依赖
com.sun
cloud-api-commons
1.0-SNAPSHOT
org.springframework.cloud
spring-cloud-starter-openfeign
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-starter-test
org.springframework.boot
spring-boot-devtools
runtime
true
org.projectlombok
lombok
true
修改application.yml
注意:feign接口调用默认你超时时间是1s,如果出现网络延迟等,会导致接口调用失败
server:
port: 80
spring:
application:
name: cloud-consumer-feign-order
eureka:
client:
fetch-registry: true
register-with-eureka: false
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
#openfeign的超时处理
feign:
client:
config:
default:
# 指的是建立连接所用的时间,适用于网络状态正常的情况下,两端连接所用的时间
connectTimeout: 5000
# 指的是建立连接后从服务器读取到可用资源所用的时间
readTimeout: 5000
修改主启动类
@SpringBootApplication
@EnableFeignClients
public class OrderOpenFeignMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderOpenFeignMain80.class, args);
}
}
日志级别
配置日志bean
@Configuration
public class LogConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
修改application.yml
#feign日志打印
logging:
level:
com.sun.cloud.service.PaymentService: debug