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;
    }
}

 

posted @   凌碎瞳缘  阅读(398)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示