Eureka:
没用Eureka前 需要用RestTemplate
服务端
1:首先大家注册中心服务端:eureka-server,这必须是一个独立的微服务 创建一个独立的spring boot工程
2:导依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
3:配置
server: #端口
port: 10086
spring:
application: #服务名
name: eureka-server
eureka:
client:
service-url: #客户端地址
defaultZone: http://127.0.0.1:10086/eureka
4:启动微服务,然后在浏览器访问:http://127.0.0.1:10086
客户端:
1:引入依赖:客户端的
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2:配置文件:
spring:
application:
name: userservice
eureka:
client:
service-url: #指向Eureka的地址
defaultZone: http://127.0.0.1:10086/eureka
负载均衡:
SpringCloudRibbon的底层采用了一个拦截器,拦截了RestTemplate发出的请求,对地址做了修改。用一幅图来总结一下:
基本流程如下:
-
拦截我们的RestTemplate请求http://userservice/user/1
-
RibbonLoadBalancerClient会从请求url中获取服务名称,也就是user-service
-
DynamicServerListLoadBalancer根据user-service到eureka拉取服务列表
-
eureka返回列表,localhost:8081、localhost:8082
-
IRule利用内置负载均衡规则,从列表中选择一个,例如localhost:8081
-
RibbonLoadBalancerClient修改请求地址,用localhost:8081替代userservice,得到http://localhost:8081/user/1,发起真实请求
-
负载均衡的规则都定义在IRule接口中,而IRule有很多不同的实现类:
-
自定义负载规则
-
代码方式:在order-service中的OrderApplication类中,定义一个新的IRule:
-
@Bean public IRule randomRule(){ return new RandomRule(); }
-
配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改规则:
-
userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务 ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
饥饿加载:
-
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:
-
ribbon: eager-load: enabled: true clients: userservice
Nacos:
1:安装启动
2:导依赖
在cloud-demo父工程的pom文件中的`<dependencyManagement>`中引入SpringCloudAlibaba的依赖:
```xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
```
然后在user-service和order-service中的pom文件中引入nacos-discovery依赖:
```xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
```
> **注意**:不要忘了注释掉eureka的依赖。
3:配置nacos地址
spring:
cloud:
nacos:
server-addr: localhost:8848
集群:
配置集群名称
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ # 集群名称
配置负载均衡模式为集群分配
在消费端配置具体服务的负载均衡模式:
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
开启集群负载均衡 就会优先调用同集群的提供方
权重配置:
在nacos可以配置权重 权重越大 那么该服务就会被使用的多
环境隔离:
1: 在nacos服务端哪里新建一个命名空间
2:在注册到nacos的地方进行命名空间分类
配置的是命名空间的Id
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ
namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID
不同命名空间的服务不可以相互调用
Nacos的服务实例分为两种l类型:
-
临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。
-
非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例。
-
spring: cloud: nacos: discovery: ephemeral: false # 设置为非临时实例
默认为临时实例 可以设置为非临时实例
-
Nacos与eureka的共同点
-
都支持服务注册和服务拉取
-
都支持服务提供者心跳方式做健康检测
-
-
Nacos与Eureka的区别
-
Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
-
临时实例心跳不正常会被剔除,非临时实例则不会被剔除
-
Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
-
Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式
-
Nacos的热更新:
在配置列表 添加配置
配置设置如下
Id应设置为配置的服务名称-具体环境.yaml
注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。
让本地访问到nacos的配置文件:
需要bootstrap.yaml文件, 它的加载优先级高于 application.yml 所以在这里面配置nacos的配置路径就可以进行加载和使用了
第一步: 引入nacos-config依赖
<!--nacos配置管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
第二步: 添加bootstrap.yaml
spring:
application:
name: userservice # 服务名称
profiles:
active: dev #开发环境,这里是dev
cloud:
nacos:
server-addr: localhost:8848 # Nacos地址
config:
file-extension: yaml # 文件后缀名
这里会根据spring.cloud.nacos.server-addr获取nacos地址,再根据
${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
作为文件id,来读取配置。
本例中,就是去读取userservice-dev.yaml
:
这里设置的需要和nacos的配置名进行对应 要不然无法进行加载
使用配置文件的属性
可以用@value(${根据具体的}) 进行加载装配
@ConfigurationProperties(prefix = "pattern") 进行装配 将里面的属性自动专配到一个类属性
@Component
@ConfigurationProperties(prefix = "pattern")
@Data
public class Pattern {
private String dateformate;
private String name;
}
配置热更新
方式一:
在@Value注入的变量所在类上添加注解@RefreshScope:
他们两个注解进行对nacos配置文件的热加载
方式二:
使用@ConfigurationProperties注解代替@Value注解。
在user-service服务中,添加一个类,读取patterrn.dateformat属性:
package cn.itcast.user.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Component @Data @ConfigurationProperties(prefix = "pattern") public class PatternProperties { private String dateformat; }
在UserController中使用这个类代替@Value:
都可以开启热更新 但是第二种 更加的美观 方便加载
配置共享:
优先级 具体远程的环境配置 大于 远程共享配置 大于 本地配置
远程共享配置 就是 只配置 服务名.yaml 中间没有具体的环境名
同服务不同环境的配置加载的都会对其进行加载
搭建集群:
-
搭建数据库,初始化数据库表结构
-
下载nacos安装包
-
配置nacos
-
启动nacos集群
-
nginx反向代理