springcloud
eureka
eureka的作用
消费者该如何获取服务提供者具体信息?
服务提供者启动时向eureka注册自己的信息,eureka保存这些信息消费者,根据服务名称向eureka拉取提供者信息
如果有多个服务提供者,消费者该如何选择?
服务消费者利用负载均衡算法,从服务列表中挑选一个消费者如何感知服务提供者健康状态?
eureka配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
server:
port: 10086
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka/
Ribbon负载均衡原理
IRule是指定负载均衡的策略
通过定义IRule实现可以修改负载均衡规则,有两种方式:
1.代码方式:在order-service中的OrderApplication类中,定义一个新的lRule:
@BeanpublicIRulee randomRule(){
return newRandomRule();
}
2.配置文件方式:在order-service的application.yml文件中
添加新的配置也可以修改规则:
userservice:
ribbon:
NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RandomRule # 负载均衡规则
NFLoadBalancerRuleClassName:com.alibaba.cloud.nacos.ribbon.NacosRule # nacos的负载均衡规则
饥饿加载
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:
ribbon:
eager-load:
enabled:true #开启饥饿加载
clients:
- userservice # 指定对userservice这个服务饥饿加载
Nacos
Github地址 https://github.com/alibaba/nacos
window 进入bin目录后 启动命令 startup.cmd -m standalone
父工程进入nacok
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
客户端依赖
<!-- nacos客户端依赖包-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: 集群名称
namespace: 环境的id
ephemeral: false 设置为非临时实例
根据权重负载均衡
Nacos控制台可以设置实例的权重值,0~1之间同集群内的多个实例,权重越高被访问的频率越高权重,设置为0则完全不会被访问
环境隔离
Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离
每个namespace下的服务不可见
统一配置管理
<!-- nacos配置管理客户端依赖包-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
在userservice中的resource目录添加一个bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml
spring:
application:
name:userservice #服务名称
profiles:
active:dev #开发环境,这里是dev
cloud:
nacos:
server-addr:LocaLhost:8848 #Nacos地址
config:
file-extension:yam #文件后缀名
配置完之后项目启动后会去找id是 name+active+file-extension
配置热更新
在类上面添加注解@RefreshScope或者@ConfigurationProperties注解
@Component
@ConfigurationProperties(prefix ="pattern")
public class PatternProperties{
private String dateformat;
}
多环境共享配置
配置优先级
服务名-Rrofile.yaml>服务名称.yaml>本地配置
Nacos 集群
https://blog.csdn.net/weixin_51265669/article/details/137127998
Nacos与eureka对比
1.Nacos与eureka的共同点
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测
2.Nacos与Eureka的区别
- Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
- 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
- Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
- Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式
Feign
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
@Feignclient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")User findById(@PathVariable("id") Long id);
}
自定义配置
feign的性能优化
Gateway
<!--网关依赖--><dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos服务发现依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
路由断言工厂
过滤器工厂
如果要对所以路由都生效,则可以把过滤工厂写到default下
全局过滤器
全局过滤器GlobalFilter全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。区别在于GatewayFilter通过配置定义,处理逻辑是固定的。而GlobalFilter的逻辑需要自己写代码实现。
当过滤器的order值一样时,会按照defaultFilter>路由过滤器>GlobalFilter的顺序执行。
跨域配置
而GlobalFilter的逻辑需要自己写代码实现。
当过滤器的order值一样时,会按照defaultFilter>路由过滤器>GlobalFilter的顺序执行。