SpringCloud nacos

****************************

准备工作

首先准备号nacos的镜像

根据镜像创建nacos容器

复制代码
  nacos:
    container_name: nacos
    image: nacos/nacos-server:v2.1.0-slim
    ports: #需要监听三个端口
      - "8848:8848"
      - "9848:9848"
      - "9849:9849"
    privileged: true
    restart: always
    environment:
      - TZ=Asia/Shanghai
      - MODE=standalone

容器启动后,访问虚拟机的8848端口

账号和密码初始都为nacos

Nacos是干什么的

cart-service是一个购物车服务,item-service是一个商品服务,购物车符合会调用商品服务,由于商品服务会被频繁调用,为了面对高并发,对item-service进行了多实例部署。

由上图可知,cart-service将会调用item-service,则会出现如下问题

为了解决如上问题,就要使用到我们的注册中心------nacos

服务注册的原理

  • 服务启动时就会注册自己的服务信息(服务名、IP、端口)到注册中心

  • 调用者可以从注册中心订阅想要的服务,获取服务对应的实例列表(1个服务可能多实例部署)

  • 调用者自己对实例列表负载均衡,挑选一个负载较小实例

  • 调用者向该实例发起远程调用

当服务提供者的实例宕机或者启动新实例时,调用者如何得知呢?

  • 服务提供者会定期向注册中心发送请求,报告自己的健康状态(心跳请求)

  • 当注册中心长时间收不到提供者的心跳时,会认为该实例宕机,将其从服务的实例列表中剔除

  • 当服务有新实例启动时,会发送注册服务请求,其信息会被记录在注册中心的服务实例列表

  • 当注册中心服务列表变更时,会主动通知微服务,更新本地服务列表

nacos注册服务

接下来,我们把服务注册到Nacos的步骤如下:

引入依赖

XML 复制代码
<!--        注册nacos服务-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

配置Nacos地址

application.properties

XML 复制代码
# 该服务在本地的端口
server.port=8080

# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
#注册的服务的名字
spring.application.name=demo01-nacos

# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos

# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口  这里填的是虚拟的的ip和端口
spring.cloud.nacos.discovery.server-addr=192.168.168.168:8848

# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public
# 应用服务 WEB 访问端口

启动springboot项目(服务)

可以看到刚才注册的服务

重新写一个一模一样的项目,只修改了nacos配置和访问的端口并启动

可以看到两个服务

nacos注册配置

nacos作为配置中心的好处

  • 集中管理:Nacos将配置信息从各个应用中剥离出来,实现了配置的集中管理。这使得配置管理变得更加高效和便捷,尤其是在微服务架构中,当服务实例数量众多时,逐个修改每个服务的配置将变得复杂且容易出错。
  • 动态更新:Nacos支持配置的动态更新,当配置发生变化时,可以实时推送到各个服务实例,无需重启应用。这极大地提高了配置的灵活性和响应速度。

案例

导入依赖

还有一个lombok可以加一下

编写application.properties中nacos配置中心的配置

XML 复制代码
# 应用服务 WEB 访问端口
server.port=8080


# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html

spring.application.name=nacos-config


# 注册nacos的配置   作为一个配置,它首先也是一个服务

# 服务相关
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=192.168.168.168:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public

# 配置相关
# Nacos认证信息
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos
spring.cloud.nacos.config.contextPath=/nacos
# 设置配置中心服务端地址
spring.cloud.nacos.config.server-addr=192.168.168.168:8848
# Nacos 配置中心的namespace。需要注意,如果使用 public 的 namcespace ,请不要填写这个值,直接留空即可
# spring.cloud.nacos.config.namespace=

# nacos:配置文件的名字
spring.config.import=nacos:demo-nacos-config.properties?refresh=true

在nacos配置中心中编辑配置

编写RedisConfig,等下用于读取配置中心的配置

java 复制代码
package com.example.config;

import lombok.Data;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties(prefix = "spring.data.redis")
@Data
public class RedisConfig {
    private String host;
    private int port;
    private String password;
    private int database;
}

编写测试控制器,读取nacos中的配置

java 复制代码
package com.example.controller;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("test")
public class DemoController {
    @Autowired
    private RedisConfig redisConfig;
    @GetMapping("getAllConfigs")
    public void getAllConfigs() {
        System.out.println(redisConfig.getHost());
        System.out.println(redisConfig.getPort());
        System.out.println(redisConfig.getPassword());
        System.out.println(redisConfig.getDatabase());
    }
}

浏览器中访问接口,查看控制台输出

符合预期,我们从nacos的配置中心中拿到了依赖

相关推荐
渣哥18 分钟前
原来 Java 里线程安全集合有这么多种
java
间彧25 分钟前
Spring Boot集成Spring Security完整指南
java
间彧1 小时前
Spring Secutiy基本原理及工作流程
java
Java水解2 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
洛小豆4 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学4 小时前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole4 小时前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端
华仔啊5 小时前
基于 RuoYi-Vue 轻松实现单用户登录功能,亲测有效
java·vue.js·后端
程序员鱼皮5 小时前
刚刚 Java 25 炸裂发布!让 Java 再次伟大
java·javascript·计算机·程序员·编程·开发·代码