首页 > 其他分享 >微服务杂谈

微服务杂谈

时间:2023-02-02 01:44:18浏览次数:59  
标签:Feign 服务 配置 杂谈 nacos 实例 集群

一、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

相关文章