Ribbon、LoadBalance(负载均衡)、OpenFeign服务--JAVA成长之路
负载均衡LB
Load Balance(负载均衡):简单的说就是将用户的请求平摊的分配到多个服务器上,从而达到系统的HA(高可用)。常见的负载均衡工具有nginx、LVS,硬件上F5等
集中式LB
即在服务的消费方和提供方之间使用独立的LB设施,可以是硬件F5、也可以是软件nginx、LVS等,提供该设施将请求通过某种策略发送给服务提供方
进程内LB
Ribbon
SpringCloud Ribbon是基于Netflix Ribbon实现的一套客户端的负载均衡工具,主要功能是提供了客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供了一系列完善的配置项例如连接超时、重试等。Ribbon目前也进入了维护模式
版本选择
SpringCloud版本依赖于SpringBoot的版本,可以从官网查询相关版本依赖关系:spring.io/projects/sp…
-
springboot 2.2.5.RELEASE
-
springcloud Hoxton.SR3
添加依赖
-
<!--eureka client-->
-
<dependency>
-
<groupId>org.springframework.cloud</groupId>
-
<artifactId>spring-cloud-starter-netflix-ribbon-client</artifactId>
-
</dependency>
-
-
<!--或者直接导入eureka client,该依赖中集成了ribbon、hystrix等Netflix组件-->
-
<!--eureka client-->
-
<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-web</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-actuator</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.projectlombok</groupId>
-
<artifactId>lombok</artifactId>
-
<optional>true</optional>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-test</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-devtools</artifactId>
-
<scope>runtime</scope>
-
<optional>true</optional>
-
</dependency>
Ribbon核心组件Irule
IRule:根据特点算法从服务列表中选取一个要访问的服务
替换Ribbon的默认负载均衡算法
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);
-
}
-
}
Ribbon VS Nginx
Nginx是服务器端的负载均衡,客户端的所有请求都会交给nginx,由nginx分发到各个服务器上。即负载均衡是由服务端实现的 Ribbon是本地的负载均衡,在调用微服务接口的时,会在注册中心上获取注册服务信息列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用的技术
OpenFeign
Feign是一个声明式的WebService客户端。使用Feign可以让编写WebService客户端更加便捷。它的使用方法是定义一个服务接口然后添加相关注解,OpenFeign支持SpringMVC标准注解和HttpMessageConverters。Feign默认结合了Ribbon,支持负载均衡
Feign和OpenFeign的区别
Feign
Feign是Spring Cloud组件中的一个轻量级Restful的HTTP服务客户端,Feign内置了Ribbon,用来做客户端的负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解接口,调用这个接口,就可以调用服务注册中心的服务
OpenFeign
OpenFeign是Spring Cloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理产生实现类,实现类中做负载均衡并调用其他服务
Feign服务的调用
公共模块中添加接口方法
-
// name属性:微服务名
-
@FeignClient(name = "cloud-payment-service")
-
public interface PaymentService {
-
// 服务提供者端的配置
-
@GetMapping("/payment/get/{id}")
-
public CommonResult<Payment> getById(@PathVariable("id") Integer id);
-
-
@GetMapping("/payment/timeout")
-
public String timeout();
-
}
添加依赖
-
<!--公共api依赖,包含feign接口-->
-
<dependency>
-
<groupId>com.sun</groupId>
-
<artifactId>cloud-api-commons</artifactId>
-
<version>1.0-SNAPSHOT</version>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.cloud</groupId>
-
<artifactId>spring-cloud-starter-openfeign</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-web</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-actuator</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-test</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-devtools</artifactId>
-
<scope>runtime</scope>
-
<optional>true</optional>
-
</dependency>
-
<dependency>
-
<groupId>org.projectlombok</groupId>
-
<artifactId>lombok</artifactId>
-
<optional>true</optional>
-
</dependency>
修改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);
-
}
-
}
OpenFeign日志信息完善
日志级别
NONE: 默认的,不显示任何日志
BASIC:仅记录请求方法,URL、响应状态码以及执行时间
HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息
FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文以及元数据
配置日志bean
-
@Configuration
-
public class LogConfig {
-
-
@Bean
-
Logger.Level feignLoggerLevel() {
-
return Logger.Level.FULL;
-
}
-
}
修改application.yml
-
#feign日志打印
-
logging:
-
level:
-
com.sun.cloud.service.PaymentService: debug