一、Ribbon
ribbon负载均衡策略
配置方法:
1, 代码方式: 配置的是当前服务调用其他服务的负载均衡规则(不能指定具体调用哪个服务器的规则)。修改时需要重新打包发布
@Bean public Irule randomRule(){ return new RandomRule(); }
2,配置文件方式:指定orderserviec调用userservice时的负载均衡规则。修改时无需重新打包发布,但无法进行全局配置。
userservice: ribbon: NFLoadBalancerRuleClassName: com.netfilx.loadbalancer.RandomRUle
饥饿加载:
服务默认是懒加载的
ribbon: eagar-load: enable: true #开启饥饿加载 clients: #指定饥饿加载的服务名称
二、NACOS注册中心
NACOS分级存储模型
1级是服务,例如userservice,2级是集群,例如深圳和杭州,三级是实例,例如杭州某台机房部署了userservice的服务器
配置方法:在配置文件中添加cluster-name,配置集群,一般按服务器地理位置配置集群。
spring: cloud: nacos: server-addr: localhost:8848 discovery: cluster-name: HZ #杭州集群
name-space: #命名空间,不同命名空间下的服务不可见
nacos负载均衡策略
1,优先选择同集群服务实例列表
2,本地集群找不到提供者,才去其他集群寻找,并且会报警告
3,确定了可用实例列表后,再采用随机挑选实例
userservice: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
可以在客户端修改不同实例的权重,调成0时不会被访问
*通常在服务升级时,需要找一个半夜时间用户少时停机更新,现在可以把权重调成0后更新,更新后先给一个小权重用来测试更新,稳定后再回复正常,用户无感知
NACOS与EUREKA注册中心对比
相同部分(调用原理):服务提供者向eureka注册服务信息,消费者需要时从注册中心拉取服务信息(消费者处会有缓存),同时防止服务信息变化,每隔三十秒定时拉取一次,消费者拿到服务列表后向服务提供者发起远程调用。
区别:1,nacos会把服务提供者划分为临时实例和非临时实例,临时实例的检测方法时心跳检测 (和eureka一样,但是nacos快以下),非临时实例是由nacos主动发起询问是否健康,就算不健康,nacos也不会把非临时实例从列表中剔除。
2,如果服务变更,nacos会主动推送变更消息给消费者,而eureka是消费者每三十秒向注册中心获取。
3,nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式,Eureka采用AP方式。
如何注册非临时实例:
spring: cloud: nacos: discovery: ephemeral: false
NACOS配置中心
获取配置步骤
配置热更新
NACOS中的配置文件变更后,微服务无需重启就可以感知,不过需要以下两种配置:
1,通过@value注解注入,结合 Spring Cloud 原生注解 @RefreshScope
实现配置热更新:
2,使用@ConfigurationProperties(prefix = "pattern")
多环境配置共享
微服务会从nacos读取的配置文件:
1,【服务名】-【spring.profile.active】.yaml 环境配置
2,【服务名】.yaml 默认配置,多环境共享
优先级:
【服务名】-【环境】.yaml > 【服务名】.yaml > 本地配置
Http客户端Feign
Feign的性能优化
Feign是个声明式客户端,它只是把我们的声明变成Http请求,最终发请求时还会用到别的客户端,底层的客户端实现:
*URLConnection:默认实现,不支持连接池
*Apache HttpClient:支持连接池
*OKHttp:支持连接池
因此优化Feign的性能主要包括:
1,使用连接池代替默认的URLConnection
2,日志级别,最好用basic或none
具体方法
导入HttpClient的依赖
<dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency>
配置连接池:
feign: client: config: default: #default 全局的配置 loggerLevel: BASIC #日志级别,BASIC就是基本的请求和相应信息 httpclient: enabled: true #开启feign对HttpClient的支持 max-connections: 200 #最大连接数 max-connections-per-route: 50 #每个路径的最大连接数
Feign的最佳实践:
1,让controller和FeignClient继承统一接口 (因为方法返回值,参数,url都是一样的,可以抽取出来,这样的作法代码耦合度变高)
2,将FeignCLient、POJO、Feign的默认配置都定义到一个项目中,共所有消费者使用 (可能不会用到所有的接口,但是需要全部导入进来,有点冗余)
方法2,会出现一个问题,当定义的FeignCLient不在Spring Boot Application的扫描包范围时,这些FeignClient无法使用。有两种方法解决
*指定Feign Client所在包
@EnableFeignClients(basePackages = "com.xxx.feign.clients"
*指定具体FeignCLient字节码
@EnableFeignClients(clients = {UserClient.class})
网关SpringCloudGateway
作用:1,对用户请求做身份认证,权限校验
2,将用户请求路由到微服务,并实现负载均衡
3,对用户请求做限流
断言工厂
过滤器执行顺序
*每一个过滤器都必须指定一个int类型的order值,值越小,优先级越高,排序越靠前
*GlobalFilter通过实现ordered接口,或者添加@order注解来指定order值,由我们自己指定
*路由过滤器和defaultFilter的order由spring指定,默认是按照生命顺序从1递增
*当过滤器的order值一样时,会按照defaultFilter > 路由过滤器 > GlobalFilter的顺序执行
标签:Feign,服务,配置,杂谈,nacos,实例,集群 From: https://www.cnblogs.com/tyleaf/p/17084351.html