没用Eureka前 需要用RestTemplate
1:首先大家注册中心服务端:eureka-server,这必须是一个独立的微服务 创建一个独立的spring boot工程
2:导依赖
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
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:引入依赖:客户端的
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
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
1:安装启动
2:导依赖
在cloud-demo父工程的pom文件中的``中引入SpringCloudAlibaba的依赖:
```xml
com.alibaba.cloud
spring-cloud-alibaba-dependencies
2.2.6.RELEASE
pom
import
```
然后在user-service和order-service中的pom文件中引入nacos-discovery依赖:
```xml
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
```
> **注意**:不要忘了注释掉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方式
在配置列表 添加配置
配置设置如下
Id应设置为配置的服务名称-具体环境.yaml
注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。
需要bootstrap.yaml文件, 它的加载优先级高于 application.yml 所以在这里面配置nacos的配置路径就可以进行加载和使用了
第一步: 引入nacos-config依赖
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
第二步: 添加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反向代理