Nacos实现负载均衡
感觉Nacos和Eureka的使用方式差不多,区别只是Eureka要自己新建个工程做服务器,而Nacos的服务器可以直接从官网下载后打开即可
父工程依赖管理引入
<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>
子工程依赖引入
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
子工程文件配置
spring:
application:
name: orderservice #服务名称
cloud:
nacos:
server-addr: localhost:8848 #启动的Nacos服务器ip地址
在RestTemplate中,添加负载均衡注解
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
@LoadBalanced //开启负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Bean //更改负载均衡规则为随机数,全局配置,之后对所有请求都采用这项规则
public IRule randomRule(){
return new RandomRule();
}
}
服务消费者向服务提供者发送http请求
@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId); //查询需要的额外信息,忽略即可
String url = "http://userservice/user/"+order.getUserId(); //userservice是前面配置的客户端或服务端名称
order.setUser(restTemplate.getForObject(url,User.class));
// 4.返回
return order;
}
也可以对单个服务提供者更改某项负载均衡规则。还有加载方式,默认是懒加载(服务第一次被请求时加载),可以改成饥饿加载(服务启动后就立刻进行所有加载)
userservice: #服务提供者的服务名
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡规则
ribbon:
eager-load:
enabled: true #开启饥饿加载
clients:
- userservice
# -userservice 需要让多个服务提供者对此消费者开启饥饿加载就挨个这样写
设置实例的集群属性
spring:
cloud:
nacos:
server-addr: localhost:8848 #启动的Nacos服务器ip地址
discovery:
cluster-name: HZ #集群名称
负载均衡规则,优先本地集群轮询访问,本地集群全挂了,才会访问外部集群
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule #负载均衡规则
设置环境隔离,非临时实例
namespace为命名空间的ID,命名空间可以在nacos服务器的网页上创建。相同命名空间的服务才能相互通信
临时实例:若服务挂掉,则会被服务器剔除;
非临时实例:若服务挂掉,不会被服务器剔除;服务挂掉后会主动推送通知服务消费者
spring:
cloud:
nacos:
discovery:
namespace: a4a51b3d-65ee-47b9-9c64-12e531a3c261
ephemeral: false #默认是临时实例,false设置为非临时实例
Nacos配置管理
需要先引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
在nacos中创建一个配置,注意:Data Id需要是“服务名称-环境.文件后缀名”。
同时也可以做一个“服务名称.文件后缀名”,来设置多环境的公共配置
然后要新建一个bootstrap.yml文件,因为nacos的配置需要比application.yml先执行,所以在application.yml里配置nacos的地址会无法执行nacos的配置,而bootstrap.yml文件的执行优先级会高出application.yml很多。将nacos的配置全部转移到bootstrap.yml中
spring:
application:
name: userservice #服务名称
profiles:
active: dev #环境
cloud:
nacos:
server-addr: localhost:8848 #nacos地址
config:
file-extension: yaml #文件后缀名
实现nacos配置文件的的热更新
可以使用@ConfigurationProperties注解,也可以用@RefreshScope搭配@Value注解
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dateformat;
}
pattern:
dateformat: yyyy-MM-dd HH:mm:ss
集群搭建
新建数据库,建表语句在nacos/conf文件夹下
修改配置文件cluster.conf.example为cluster.conf,也可以直接新建一个,反正是官方给的例子文件
在cluster.conf文件中添加所有集群中的nacos的ip地址
注意:nacos的/data/protocol文件中,会记录你电脑当前的IP地址,而不是127.0.0.1这种指向性的IP地址。所以下次重启电脑时,如果IP地址发生了更改,项目会无法正常访问nacos,这时我们需要删除/data/protocol这个文件,或者去固定自己的IP地址
修改application.properties文件,添加数据库配置:
server.port=8845 //本nacos端口号
spring.datasource.platform=mysql
db.num=1 //数据库数量
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123
最后使用nginx,conf/nginx.conf文件下配置反向代理
upstream nacos-cluster {
server 127.0.0.1:8845;
server 127.0.0.1:8846;
server 127.0.0.1:8847;
}
server {
listen 80;
server_name localhost;
location /nacos {
proxy_pass http://nacos-cluster;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?