网站首页 > 精选教程 正文
前言
随着服务注册中心的安装完成后,客户端的负载均衡和服务的调用又是我们关注的话题。Ribbon可以实现客户端的负载均衡,而OpenFeign则是可以让我们像调用Dubbo接口一样,实现面向接口编程
负载均衡LB
Load Balance(负载均衡):简单的说就是将用户的请求平摊的分配到多个服务器上,从而达到系统的HA(高可用)。常见的负载均衡工具有nginx、LVS,硬件上F5等
集中式LB
即在服务的消费方和提供方之间使用独立的LB设施,可以是硬件F5、也可以是软件nginx、LVS等,提供该设施将请求通过某种策略发送给服务提供方
进程内LB
将LB逻辑集成到消费方,消费方从服务注册中心查找服务列表,然后获取服务地址根据某种规则选出合适的服务器。Ribbon就是进程内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
作者:小小学生爱读书
链接:https://juejin.im/post/5e7366cee51d4526ee0f9d5f
猜你喜欢
- 2024-11-19 阿里高频面试题汇总
- 2024-11-19 Java 类加载:性能影响
- 2024-11-19 Dubbo的使用及原理分析
- 2024-11-19 Java常用的包库及快捷键
- 2024-11-19 JAVA动态代理的作用是什么?
- 2024-11-19 2022 Java 企业面试题汇总
- 2024-11-19 SpringCloud远程服务调用的方式RPC和HTTP
- 2024-11-19 Android APP漏洞之战(7)——信息泄露漏洞详解
- 2024-11-19 微服务的那些事(三),微服务的远程调用方式。RPC和HTTP
- 2024-11-19 C#宿舍管理系统
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)