负载均衡Ribbon
什么是负载均衡 :负载均衡(Load Balance)其意思就是服务(访问请求)分摊到多个操作单元(服务器,组件 )上进行执行
1、什么是ribbon?
ribbon是基于netfilx ribbon实现的一个工作在consumer端的负载均衡工具,提供了很多负载均衡策略:轮询、随机。
2、ribbon的启动器
- nacos已经集成了ribbon,故无启动器
ribbon入门案例
1、开启ribbon的负载均衡:
@Bean
@LoadBalanced //原理:①拦截器-->List<Service> ②负载均衡算法--->Service ③把url中的服务名替换为ip、port
2、调用provider
3、指定负载均衡算法
@Bean
public IRule iRule(){
return new RandomRule();
}
声明式服务调用Feign
1.什么是feign
- feign是springcloud提供的声明式(接口),模板化 HTTP客户端(工作在consumer端)
- feign支持了springMVC注解
- feign继承了Ribbon也支持负载均衡
2.feign的入门案例
1.创建 feign_provider 服务提供者:
pom.xml的依赖
<dependencies>
<dependency>
<groupId>com.bjpowernode</groupId>
<artifactId>feign_interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
application.yml
server:
port: 8081
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.88.132:8848
application:
name: feign-provider
FeignProviderApp
@SpringBootApplication
@EnableDiscoveryClient
public class FeignProviderApp {
public static void main(String[] args) {
SpringApplication.run(FeignProviderApp.class,args);
}
}
controller
@RestController
@RequestMapping("/provider")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/getUserById/{id}")
public User getUserById(@PathVariable Integer id){
return userService.getUserById(id);
}
userService
public interface UserService {
User getUserById(Integer id);
userServiceImpl
@Service
public class UserServiceImpl implements UserService {
@Override
public User getUserById(Integer id) {
return new User(id,"张三","男",18);
}
2.创建 feign_interface接口
pom.xml
<dependencies>
<dependency>
<groupId>com.bjpowernode</groupId>
<artifactId>springcloud_common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
创建一个userFeign接口
@FeignClient(value = "feign-provider")
@RequestMapping("/provider")
public interface UserFeign{
@RequestMapping("/getUserById/{id}")
User getUserById(@PathVariable("id") Integer id);
3.创建 feign_consumer服务消费者
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.bjpowernode</groupId>
<artifactId>feign_interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.bjpowernode</groupId>
<artifactId>springcloud_common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
application.yml 配置文件
server:
port: 8080
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.88.132:8848
application:
name: feign-consumer
FeignConsumerApp启动类
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients //开启feign接口扫描
public class FeignConsumerApp {
public static void main(String[] args) {
SpringApplication.run(FeignConsumerApp.class,args);
}
}
controller
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
@Autowired
private UserFeign userFeign;
@RequestMapping("/getUserById/{id}")
public User getUserById(@PathVariable Integer id){
return userFeign.getUserById(id);
}
4.测试
3.feign的工作原理
1.扫描feign接口生成代理类并交给spring容器去管理
@EnableFeignClient开启feign注解扫描:FeignClientsRegistrar.registerFeignClients()扫描被 @FeignClient标识的接口并生成代理类, 再把代理类交给spring的容器去管理
2.为接口的方法创建requestTemplate
当consumer调用feign接口的代理类时,会调用SynchronousMethodHandler.invoke()创建RequestTemplate(HttpMethod、UriTemplate、Body)
3.发送请求
代理类会通过requestTemplate创建request对象,然后client(HttpClient、URLConnect、OkHttp)使用request发送请求
4.Feign的传参方式
1.restful风格:
feign接口:@PathVarible 【拼接restful形式的url】
2. ?传参:
feign接口:@RequestParam 【拼接?形式的url】
3.pojo传参:
provider: @RequestBody User user【获取请求体中的json字符串】
5.feign优化
1.feign日志的级别:
OpenFeign 提供了日志增强功能,它的日志级别有以下几个:
NONE:默认的,不显示任何日志。
BASIC:仅记录请求方法、URL、响应状态码及执行时间。
HEADERS:除了 BASIC 中定义的信息之外,还有请求和响应的头信息。
FULL:除了 HEADERS 中定义的信息之外,还有请求和响应的正文及元数据。
2.开启feign的日志
6. http连接池
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
7.GZIP 压缩
server:
port: 80
compression:
enabled: true #开启浏览器<---->consumer的gzip压缩
feign:
compression: #开启feign<---->provider的gzip压缩
request:
enabled: true
response:
enabled: true
8.Feign请求超时
设置feign超时时间
ribbon:
ConnectTimeout: 5000 #请求连接的超时时间
ReadTimeout: 5000 #请求处理的超时时间