入门学习nacos

nacos学习

一、nacos是什么?

Nacos 英文全称为 Dynamic Naming and Configuration Service,是一个由阿里巴巴团队使用 Java 语言开发的开源项目。

Nacos 是一个更易于帮助构建云原生应用的动态服务发现配置管理服务管理平台(参考自 Nacos 官网)。

image.png

总结下来主要做三件事:

  1. 动态服务发现
  2. 服务管理
  3. 配置管理

nacos 名字的由来(了解)

Nacos 的命名是由 3 部分组成:

组成部分全称描述
Nanaming/nameServer即服务注册中心,与 Spring Cloud Eureka
的功能类似。
coconfiguration即配置中心,与 Spring Cloud Config
+Spring Cloud Bus
的功能类似。
sservice即服务,表示 Nacos
实现的服务注册中心和配置中心都是以服务为核心的。

我们可以将 Nacos 理解成服务注册中心和配置中心的组合体,它可以替换 Eureka 作为服务注册中心,实现服务的注册与发现;还可以替换 Spring Cloud Config 作为配置中心,实现配置的动态刷新。

Nacos 作为服务注册中心经历了十年“双十一”的洪峰考验,具有简单易用、稳定可靠、性能卓越等优点,可以帮助用户更敏捷、容易地构建和管理微服务应用。

Nacos 支持几乎所有主流类型“服务”的发现、配置和管理:

转载自:Nacos:Spring Cloud Alibaba服务注册与配置中心(非常详细) (biancheng.net)

二、为什么使用Nacos

或者说 nacos 有什么优势?

  1. eureka 2.0闭源
  2. 开箱即用,上手简洁,暂时也没发现有太大的坑
  3. nacos使用的raft协议,nacos集群的一致性要远大于eureka集群
  4. 因为nacos功能更加丰富,社区更加活跃
  5. 背靠国内大厂(经受双十一的考验),中英文文档
  6. 界面美观
  7. 支持 k8s

三、nacos的架构

基本架构及概念(了解)

这张图通过三个部分查看

第一个部分是 Multi-Datacenter Nacos ClusterNacos Server 这是 Nacos 的核心

第二部分是 NacosConsole 控制中心

第三部分是外部的 ProviderConsumer

  • Nameserver:解决namespaceclusterid的路由问题,解决用户环境与nacos物理环境映射问题
  • Provider APP:是指提供可复用和可调用服务的应用方。
  • Comsumer APP:是指会发起对某个服务调用的应用方。
  • OpenAPI:暴露标准Rest风格HTTP接口,简单易用,方便多语言集成
  • Naming Service:提供分布式系统中所有对象(Object)、实体(Entity)的“名字”到关联的元数据之间的映射管理服务,例如 ServiceName -> Endpoints Info, Distributed Lock Name -> Lock Owner/Status Info, DNS Domain Name -> IP List, 服务发现和 DNS 就是名字服务的2大场景。
  • Configuration Service:在服务或者应用运行过程中,提供动态配置或者元数据以及配置管理的服务提供者。
  • 一致性协议:解决不同数据,不同一致性要求情况下,不同一致性机制
  • Console:易用控制台,做服务管理、配置管理等操作

逻辑架构及组件介绍(了解)

  • 服务管理:实现服务CRUD,域名CRUD,服务健康状态检查,服务权重管理等功能
  • 配置管理:实现配置管CRUD,版本管理,灰度管理,监听管理,推送轨迹,聚合数据等功能
  • 元数据管理:提供元数据CURD 和打标能力
  • 插件机制:实现三个模块可分可合能力,实现扩展点SPI机制
  • 事件机制:实现异步化事件通知,sdk数据变化异步通知等逻辑
  • 日志模块:管理日志分类,日志级别,日志可移植性(尤其避免冲突),日志格式,异常码+帮助文档
  • 回调机制:sdk通知数据,通过统一的模式回调用户处理。接口和数据结构需要具备可扩展性
  • 寻址模式:解决ip,域名,nameserver、广播等多种寻址模式,需要可扩展
  • 推送通道:解决server与存储、server间、serversdk间推送性能问题
  • 容量管理:管理每个租户,分组下的容量,防止存储被写爆,影响服务可用性
  • 流量管理:按照租户,分组等多个维度对请求频率,长链接个数,报文大小,请求流控进行控制
  • 缓存机制:容灾目录,本地缓存,server缓存机制。容灾目录使用需要工具
  • 启动模式:按照单机模式,配置模式,服务模式,dns模式,或者all模式,启动不同的程序+UI
  • 一致性协议:解决不同数据,不同一致性要求情况下,不同一致性机制
  • 存储模块:解决数据持久化、非持久化存储,解决数据分片问题
  • Nameserver:解决namespaceclusterid的路由问题,解决用户环境与nacos物理环境映射问题
  • CMDB:解决元数据存储,与三方cmdb系统对接问题,解决应用,人,资源关系
  • Metrics:暴露标准metrics数据,方便与三方监控系统打通
  • Trace:暴露标准trace,方便与SLA系统打通,日志白平化,推送轨迹等能力,并且可以和计量计费系统打通
  • 接入管理:相当于阿里云开通服务,分配身份、容量、权限过程
  • 用户管理:解决用户管理,登录,sso等问题
  • 权限管理:解决身份识别,访问控制,角色管理等问题
  • 审计系统:扩展接口方便与不同公司审计系统打通
  • 通知系统:核心数据变更,或者操作,方便通过SMS系统打通,通知到对应人数据变更
  • OpenAPI:暴露标准Rest风格HTTP接口,简单易用,方便多语言集成
  • Console:易用控制台,做服务管理、配置管理等操作
  • SDK:多语言sdk
  • Agentdns-f类似模式,或者与mesh等方案集成
  • CLI:命令行对产品进行轻量化管理,像git一样好用

nacos 目前的功能

feature-list (nacos.io)

nacos两大组件

Eureka 类似,Nacos 也采用 CSClient/Server,客户端/服务器)架构,它包含两大组件,如下表。

组件描述功能
Nacos ServerNacos
服务端,与 Eureka Server
不同,Nacos Server
由阿里巴巴团队使用 Java
语言编写并将 Nacos Server
的下载地址给用户,用户只需要直接下载并运行即可。
Nacos Server
可以作为服务注册中心,帮助 Nacos Client
实现服务的注册与发现。
Nacos Server
可以作为配置中心,帮助 Nacos Client
在不重启的情况下,实现配置的动态刷新。
Nacos ClientNacos
客户端,通常指的是微服务架构中的各个服务,由用户自己搭建,可以使用多种语言编写。
Nacos Client
通过添加依赖 spring-cloud-starter-alibaba-nacos-discovery
,在服务注册中心(Nacos Server
)中实现服务的注册与发现。
Nacos Client
通过添加依赖 spring-cloud-starter-alibaba-nacos-config
,在配置中心(Nacos Server
)中实现配置的动态刷新。

CAP原则

CAP原理主要讲的是在一个分布式系统中的一致性(Consistency),可用性(Availability)和分区容错性(Partition tolerance),这三点只能满足两点

其中

  • Consistency:表示同一个时刻,分布式系统中所有备份的数据是否相同
  • Availability:任何请求不论成功与否,都会有反应
  • Partition tolerance:任何信息的丢失或者节点的失败不会影响整个分布式系统的运行

可以看出这三点中有一点必须满足,分区容错性Partition tolerance,否则系统只要丢失掉一个节点,整个分布式系统都将无法工作

所以对于一个分布式组件来说,要么满足AP,要么满足CP

而众所周知的 zookeeper 满足了 CP,抛弃了 A

Eurake满足了 AP,保证了 C 的最终一致性

而本文 的 nacos 默认启动 AP,同时也支持CP

nacos和一致性算法

为什么 nacos 需要一致性算法?

nacos 为了尽量减少用户的部署和运营成本,做到用户只需要一个包就可以快速启动nacos单机或者集群,因此 nacos 需要存储一些数据。

nacos在单机下存储数据问题不大,但是在集群下就需要一些一致性算法帮助各个节点进行数据同步,就不得不引入现存的一些共识算法咯

为什么 nacos 选择raft以及distro

raft共识算法

raft 协议简单入门看这里:(了解)

https://juejin.cn/post/7116445621082390565

  • nacos作为服务发现注册中心而言:

而服务发现注册中心必须要保证可用性,而强一致性协议的情况下,如果集群可用的节点数没有过半的话,可能导致注册中心在部分时间内不可用

所以最终nacos选择了 AP 并配合 最终一致性 作为 服务发现注册中心 的底层共识算法

以上针对 nacos 非持久化数据而言,对于持久化数据来说,就不需要选择AP,可以配合强一致性共识算法

  • nacos 作为配置中心的而言:

配置数据中心必须保证绝大多数节点的配置都是一致的,否则可能导致配置不同或者配置丢失引起分布式系统中的节点出现严重的问题,所以对于配置数据中心而言,配置必须使用强一致性

所以 nacos 同时支持 APCP

那为什么 nacos 选择 raftdistro 呢?

首先 raft 是强一致性共识算法,而且很好理解,其次 nacos 背靠阿里,实现了另一套基于raft的算法 JRaft

JRaft支持多 RaftGroup, 也可以为 nacos 后面提供多数据分片带来了可能

distro协议

**distro**** 协议是阿里巴巴自研的⼀个最终⼀致性协议**,而最终⼀致性协议有很多,比如 GossipEureka 内的数据同步算法。而 distro 算法是集 Gossip 以及 Eureka 协议的优点并加以优化而出来的,对于原生的 Gossip由于随机选取发送消息的节点,也就不可避免的存在消息重复发送给同⼀节点的情况,增加了网络的传输的压力,也给消息节点带来额外的处理负载,而 distro 算法引入了 Server 的概念,每个节点负责⼀部分数据以及将自己的数据同步给其他节点,有效的降低了消息冗余的问题

四、怎么装?

git 上下载

Release 2.1.0 (Apr 29, 2022) · alibaba/nacos (github.com)

Linux/Unix/Mac下启动方式

启动命令(standalone代表着单机模式运行,非集群模式):

sh startup.sh -m standalone

如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:

bash startup.sh -m standalone

window下启动

请进入目录 D:\programs\env\nacos-server-2.1.0_2\nacos\bin

./startup.cmd -m standalone

单机启动

可以在控制台看到

image.png

这里我使用的是 docker 安装的 nacos,后面会讲

这里有个坑,application.properties里面的几个属性都是无效的,不知道是不是我没弄清楚什么。。。

nacos.config.data-id=example
nacos.config.group=DEFAULT_GROUP
nacos.config.auto-refresh=true



docker上安装nacos的坑

如果你选择在 docker 上安装 nacos , 你只需要下载 nacos/nacos-server 这个镜像包

然后你会看到 docker hub 上的 quick start:

image.png

你跟着做,你会发现 nacos 启动成功了,但你 spring-boot 项目怎么都无法启动成功

如果你回到 nacos 官方文档,又会看到另一个方式:

image.png

需要你去 githubclone 项目

如果你没梯子,会很麻烦,而且也很复杂

那我只想要 docker hub 上的 nacos 怎么办?

nacos-group/nacos-docker: This project contains a Docker image meant to facilitate the deployment of Nacos . (github.com)

看上面网址

这里会有个 quick start

docker run --name nacos-quick -e MODE=standalone -p 8848:8848 -p 9848:9848 -d nacos/nacos-server:2.0.2

你会发现问题

多了个端口 9848

对, 这才是对的。。。

然后你回去看 nacos 的镜像配置

image.png

咦,不是只暴露了一个端口么? 怎么还要另一个端口?

答案在这里:

Nacos 2.0.0 兼容性文档

Nacos2.0版本相比1.X新增了gRPC的通信方式,因此需要增加2个端口。新增端口是在配置的主端口(server.port)基础上,进行一定偏移量自动生成。

端口与主端口的偏移量描述
98481000客户端gRPC
请求服务端端口,用于客户端向服务端发起连接和请求
98491001服务端gRPC
请求服务端端口,用于服务间同步等

好吧,我直接 nacos 2.1 的,谁会没事去关注兼容问题,害~ 我没话说了,下次一定跟官网走。。。

github nacos-docker 需要注意的地方

github上的 nacos-docker 这个项目会三种方式告诉你如何启动 nacos

image.png

  • 单机模式 Derby: 这种模式是极简模式,数据没法持久化存储,适合开发环境。
  • 单机模式 MySQL:(支持MySQL5.7MySQL8.0,我们这里学习MySQL5.7安装模式,因为当前主流还是MySQL5.7) 这种模式支持数据持久化,数据会存储到MySQL中,适合生产环境。
  • 集群模式: 这种模式适合生产环境并且服务节点个数较多,不存在单点故障问题。

注意上面使用 mysql 的方式启动需要 mysql 表结构,而表结构在 nacos 官方的项目中
https://github.com/alibaba/nacos/blob/develop/config/src/main/resources/META-INF/nacos-db.sql

四、springboot整合nacos

nacos配置中心

nacos上面需要这样:

  1. 新建命名空间

image.png

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2dxlmKpD-1658062039217)(https://cdn.nlark.com/yuque/0/2022/png/22744322/1657979496082-688577f1-ab62-4081-8836-6f8b62488285.png#clientId=u5fdb570e-0421-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=323&id=u53966d78&name=image.png&originHeight=323&originWidth=1266&originalType=binary&ratio=1&rotation=0&showTitle=false&size=41931&status=done&style=none&taskId=u3c43da5f-13bd-4709-a6d5-640cf83f62f&title=&width=1266)]

配置列表的内容是:

image.png

代码

image.png

首先创建 springboot maven项目

pom.xml 如下:(这里是 maven pom 项目,注意自己去创建一个新模块 导入 dependencyManagement 内的依赖)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zhazha</groupId>
    <artifactId>spring-nacos-parent</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>spring-boot-nacos-config</module>
    </modules>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.boot</groupId>
                <artifactId>nacos-config-spring-boot-starter</artifactId>
                <version>0.2.11</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba.boot</groupId>
                <artifactId>nacos-discovery-spring-boot-starter</artifactId>
                <version>0.2.11</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.7.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2021.0.3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2021.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.24</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

application.yml

nacos:
  config:
    server-addr: 127.0.0.1:8848
    namespace: f4d95375-72ac-4197-9314-87b7fc0d0530
spring:
  application:
    name: nacos-config
server:
  port: 8080

这里需要注意,命名空间需要填入 image.png
而不是 namespace: spring-boot

package com.zhazha.config;

import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@NacosPropertySource(dataId = "nacos-config.properties", groupId = "spring-boot-config", autoRefreshed = true)
public class NacosConfigApplication {
	
	public static void main(String[] args) throws Exception {
		SpringApplication.run(NacosConfigApplication.class, args);
	}
}

package com.zhazha.config.controller;

import com.alibaba.nacos.api.config.annotation.NacosValue;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import static org.springframework.web.bind.annotation.RequestMethod.GET;

@RestController
public class ConfigController {
	
	@NacosValue(value = "${useLocalCache:false}", autoRefreshed = true)
	private boolean useLocalCache;
	
	@RequestMapping(value = "/get", method = GET)
	@ResponseBody
	public boolean get() {
		return useLocalCache;
	}
	
}

image.png

成了

注意 autoRefreshed = true ,这样微服务才随时能感知 nacos 配置的变化

nacos服务发现

服务提供端
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-nacos-parent</artifactId>
        <groupId>com.zhazha</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring-boot-nacos-discovery-producer</artifactId>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>nacos-discovery-spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>com.alibaba.spring</groupId>
                    <artifactId>spring-context-support</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba.spring</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>1.0.11</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>nacos-discovery-spring-boot-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

</project>

巨坑:nacos springboot 包中的spring-context-support依赖不向前兼容,导致项目启动报错:
com.sun.proxy.$Proxy27 cannot be cast to class java.util.Map (com.sun.proxy.$Proxy27 is in unnamed module of loader 'app'; java.util.Map is in module java.base of loader 'bootstrap')
看了下,就差了一个版本:1.0.10 人都傻了

application.yml

spring:
  application:
    name: service-producer
nacos:
  discovery:
    server-addr: 127.0.0.1:8848
management:
  endpoints:
    web:
      exposure:
        include: *
package com.zhazha;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class NacosDiscoveryApplication {
	
	public static void main(String[] args) throws Exception {
		SpringApplication.run(NacosDiscoveryApplication.class, args);
	}
	
}

package com.zhazha.controller;

import com.alibaba.nacos.api.annotation.NacosInjected;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RegisterController {
	
	@NacosInjected
	private NamingService namingService;
	
	@GetMapping("/register")
	public boolean getServiceName() throws NacosException {
		namingService.registerInstance("example", "127.0.0.1", 8080);
		return true;
	}
	
}

启动服务,访问 http://127.0.0.1:8080/register 注册服务

image.png

服务消费端
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-nacos-parent</artifactId>
        <groupId>com.zhazha</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring-boot-nacos-dicovery-consumer</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>nacos-discovery-spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>com.alibaba.spring</groupId>
                    <artifactId>spring-context-support</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba.spring</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>1.0.11</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>nacos-discovery-spring-boot-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

</project>
server:
  port: 8081
spring:
  application:
    name: service-consumer
nacos:
  discovery:
    server-addr: 127.0.0.1:8848
management:
  endpoints:
    web:
      exposure:
        include: *
package com.zhazha.consumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class NacosDiscoveryApplication {
	
	public static void main(String[] args) throws Exception {
		SpringApplication.run(NacosDiscoveryApplication.class, args);
	}
	
}

package com.zhazha.consumer.controller;

import com.alibaba.nacos.api.annotation.NacosInjected;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
import org.springframework.web.bind.annotation.*;
import java.util.List;

@RestController
public class DiscoveryController {
	
	@NacosInjected
	private NamingService namingService;
	
	@GetMapping(value = "/get")
	public List<Instance> get(@RequestParam String serviceName) throws NacosException {
		return namingService.getAllInstances(serviceName);
	}

}

image.png

成功了

五、springcloud 整合 nacos

配置中心

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-nacos-parent</artifactId>
        <groupId>com.zhazha</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring-cloud-nacos-config-center</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
    </dependencies>

</project>

这里需要注意添加:spring-cloud-starter-bootstrap,这一点官网没说,给的例子也是较为低的 spring-boot 版本,这点需要注意

nacos 官方都说了 要用到 bootstrap.yml 配置文件

新建 bootstrap.yml 文件,填入下面代码:

spring:
  application:
    name: nacos-config
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      config:
        file-extension: properties
        namespace: edc7dbc5-31bb-4bb6-bbe7-b76e0828e918
        group: spring-cloud-config
        username: nacos
        password: nacos

namespace 在这里能看到: image.png

application.yml 文件中填入代码:

server:
  port: 8080
package com.zhazha.config;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringCloudNacosConfigApplication {
	
	public static void main(String[] args) throws Exception {
		SpringApplication.run(SpringCloudNacosConfigApplication.class, args);
	}
	
}


package com.zhazha.config.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope
public class ConfigController {
	
	@Value("${user.id:}")
	private String username;
	
	@Value("${user.password:}")
	private String password;
	
	@RequestMapping(value = "get")
	@ResponseBody
	public String getUser() {
		return String.format("username = %s, password = %s\n", username, password);
	}
	
}

这里只能使用@Value,如果使用@NacosValue注解,无效

image.png

image.png

这里需要注意:配置文件名必须是 spring.application.name+ spring.profiles.active + . + spring.cloud.nacos.config.file-extension
比如你的 application名字是 zhazha,然后 active 写成 dev,最后file-extension 写上 yaml 或者 properties (目前只支持这两种)

然后你会发现不成功

image.png

为什么?

如果你是新手可以直接搜索:“springcloud nacos 配置中心 坑”调整下时间,近期一年的搜索就会找到解决方法

问题很简单,spring-boot 从 版本开始就将 bootstrap.yml 剥离出去了,所以需要添加包

  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
  </dependency>

这样 bootstrap.yml 配置文件才会生效

重新启动,就可以了

image.png

很多时候不要去嘲讽那些守旧的人,特别是java8程序员,他们吃过的盐比我们吃过的饭还多。哈哈哈

nacos服务发现

服务提供端
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-nacos-parent</artifactId>
        <groupId>com.zhazha</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring-cloud-nacos-discovery-producer</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

</project>

application.yml

server:
  port: 8080

bootstrap.yml

spring:
  application:
    name: service-producer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        username: nacos
        password: nacos
        namespace: edc7dbc5-31bb-4bb6-bbe7-b76e0828e918
        group: spring-cloud
package com.zhazha.producer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class SpringCloudNacosProducerApplication {
	
	public static void main(String[] args) throws Exception {
		SpringApplication.run(SpringCloudNacosProducerApplication.class, args);
	}
	
	@GetMapping("get")
	public String sayHi(String name) {
		return "producer: " + name;
	}
	
}

启动项目后将会在这里看到:

image.png

可以访问:

image.png

服务的消费端
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-nacos-parent</artifactId>
        <groupId>com.zhazha</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring-cloud-nacos-discovery-consumer</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

</project>

application.yml

server:
  port: 8081

bootstrap.yml

spring:
  application:
    name: service-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        username: nacos
        password: nacos
        namespace: edc7dbc5-31bb-4bb6-bbe7-b76e0828e918
        group: spring-cloud
package com.zhazha.consumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApplication {
	
	@LoadBalanced
	@Bean
	public RestTemplate restTemplate() {
		return new RestTemplate();
	}
	
	public static void main(String[] args) throws Exception {
		SpringApplication.run(NacosConsumerApplication.class, args);
	}
	
}

package com.zhazha.consumer.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class ConsumerController {
	
	private final RestTemplate restTemplate;
	
	@Autowired
	public ConsumerController(RestTemplate restTemplate) {
		this.restTemplate = restTemplate;
	}
	
	@GetMapping("consumer/{name}")
	public String consumer(@PathVariable String name) {
		return restTemplate.getForObject("http://localhost:8080/get?name={name}", String.class, name);
	}

}

image.png

成功了

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值