



为了规范依赖的版本,这里创建父工程,指定依赖的版本。
父工程pom.xml如下:
- <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.0modelVersion>
-
- <groupId>com.demo.nacosgroupId>
- <artifactId>nacos-discoveryartifactId>
- <version>1.0-SNAPSHOTversion>
-
- <packaging>pompackaging>
-
- <properties>
- <project.build.sourceEncoding>UTF‐8project.build.sourceEncoding>
- <project.reporting.outputEncoding>UTF‐8project.reporting.outputEncoding>
- <java.version>1.8java.version>
- properties>
-
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-alibaba-dependenciesartifactId>
- <version>2.1.0.RELEASEversion>
- <type>pomtype>
- <scope>importscope>
- dependency>
-
- <dependency>
- <groupId>org.springframework.cloudgroupId>
- <artifactId>spring-cloud-dependenciesartifactId>
- <version>Greenwich.RELEASEversion>
- <type>pomtype>
- <scope>importscope>
- dependency>
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-dependenciesartifactId>
- <version>2.1.3.RELEASEversion>
- <type>pomtype>
- <scope>importscope>
- dependency>
- dependencies>
- dependencyManagement>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-maven-pluginartifactId>
- plugin>
- plugins>
- build>
- project>

创建生产者模块




以下步骤演示了如何将一个服务生产者注册到 Nacos。
1、pom.xml的配置。
包括Spring Cloud Feign组件、Spring Cloud Alibaba Nacos Discovery组件以及Spring boot web相关组件依赖。
- <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>nacos-discoveryartifactId>
- <groupId>com.demo.nacosgroupId>
- <version>1.0-SNAPSHOTversion>
- parent>
- <modelVersion>4.0.0modelVersion>
-
- <artifactId>quickstart-providerartifactId>
-
- <dependencies>
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
- dependency>
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-webartifactId>
- dependency>
-
- <dependency>
- <groupId>org.springframework.cloudgroupId>
- <artifactId>spring-cloud-starter-openfeignartifactId>
- dependency>
- dependencies>
- project>
2、application.yml配置。一些关于 Nacos 基本的配置也必须在application.yml(也可以是application.properties)
配置,如下所示: application.yml
- server:
- port: 56010 # 启动端口
-
- spring:
- application:
- name: quickstart-provider
- cloud:
- nacos:
- discovery:
- server-addr: 127.0.0.1:8848
- logging:
- level:
- root: info
- org.springframework: info
Note: spring.cloud.nacos.discovery.server-addr 指定了Nacos Server的网络地址和端口号。
- package com.demo.nacos;
-
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
- import org.springframework.cloud.openfeign.EnableFeignClients;
-
- /**
- * Description:
- * DATE: 2022/1/26 17:14
- */
- @SpringBootApplication
- @EnableDiscoveryClient
- @EnableFeignClients
- public class NacosProviderApp {
- public static void main(String[] args) {
- SpringApplication.run(NacosProviderApp.class,args);
- }
- }
-
- package com.demo.nacos.controller;
-
- import org.slf4j.LoggerFactory;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.RestController;
-
- import java.util.logging.Logger;
-
- /**
- * Description:
- * DATE: 2022/1/26 17:15
- */
- @RestController
- public class ProviderController {
- private static final Logger LOG = (Logger) LoggerFactory.getLogger(ProviderController.class);
-
- @GetMapping("/service")
- public String service(){
- LOG.info("provider invoke");
- return "provider invoke";
- }
- }
1、pom.xml的配置。
- <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>nacos-discoveryartifactId>
- <groupId>com.demo.nacosgroupId>
- <version>1.0-SNAPSHOTversion>
- parent>
- <modelVersion>4.0.0modelVersion>
-
- <artifactId>quickstart-consumerartifactId>
- <dependencies>
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
- dependency>
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-webartifactId>
- dependency>
-
- <dependency>
- <groupId>org.springframework.cloudgroupId>
- <artifactId>spring-cloud-starter-openfeignartifactId>
- dependency>
- dependencies>
- project>
2、application.yml配置
- server:
- port: 56020 # 启动端口
-
- spring:
- application:
- name: quickstart-consumer
- cloud:
- nacos:
- discovery:
- server-addr: 127.0.0.1:8848
- logging:
- level:
- root: info
- org.springframework: info
3、Consumer(消费者)启动类
- package com.demo.nacos;
-
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
- import org.springframework.cloud.openfeign.EnableFeignClients;
-
- /**
- * Description:
- * DATE: 2022/1/26 17:42
- */
- @SpringBootApplication
- @EnableDiscoveryClient
- @EnableFeignClients
- public class NacosConsumerApp {
- public static void main(String[] args) {
- SpringApplication.run(NacosConsumerApp.class, args);
- }
- }
4、Provider(生产者)远程代理定义
- package com.demo.nacos.client;
-
- import org.springframework.cloud.openfeign.FeignClient;
- import org.springframework.web.bind.annotation.GetMapping;
-
- /**
- * Description:
- * DATE: 2022/1/26 17:36
- */
- @FeignClient(value = "quickstart-provider")
- public interface ProviderClient {
-
- @GetMapping("service")
- String service();
- }
5、Consumer(消费者)服务实现
- package com.demo.nacos.controller;
-
- import com.demo.nacos.client.ProviderClient;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.RestController;
-
- /**
- * Description:
- * DATE: 2022/1/26 17:39
- */
- @RestController
- public class ConsumerController {
-
- private static final Logger log = LoggerFactory.getLogger(ConsumerController.class);
-
- @Autowired
- ProviderClient providerClient;
-
- @GetMapping("/service")
- public String service(){
- log.info("consumer invoke");
- //远程调用
- String providerResult = providerClient.service();
- return "consumer invoke"+"|"+providerResult;
- }
- }
浏览器访问 http://127.0.0.1:8848/nacos ,打开nacos控制台,并点击菜单服务管理->服务列表,可展示出刚刚注
册的两个服务:

访问地址:http://127.0.0.1:56020/service

修改quickstart-provider工程的application.yaml,实现port动态传入:

设置启动参数:
NacosProviderApp

NacosProviderApp

启动quickstart-provider两个实例。



请求http://127.0.0.1:56020/service测试负载均衡。
跟踪quickstart-provider两个实例的控制台的日志输出,默认负载均衡策略是轮询。


n
nacos在经过阿里内部多年生产经验后提炼出的数据模型,则是一种服务-集群-实例的三层模型,这样基本可以满足服务在所有场景下的数据存储和管理。

用于进行租户粒度的配置隔离,命名空间不仅适用于nacos的配置管理,同样适用于服务发下。Namespace的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置,服务)隔离等。
提供给客户端的软件功能,通过预定义接口网络访问。
提供一个或多个服务的具有可访问网络地址的进程,启动一个服务,就产生一个服务实例。
nacos数据描述信息,如服务版本,权重,容灾策略,负载均衡策略,鉴权配置,各种自定义标签,从作用范围来看,分为服务级别的元信息,集群的元信息以及实例的元信息。

服务实例的集合,服务实例组成一个默认集群,集群可以被进一步按需求划分,划分的单位可以是虚拟集群,相同集群下的实例才能相互感知。
应用通过Namespace,Service ,Cluster(DEFAULT)的配置,描述了该服务向哪个环境的哪个集群注册实例。
- spring:
- application:
- name: provider
- cloud:
- nacos:
- discovery:
- server-addr: 127.0.0.1:8848
- namespace: 869a0c6d-267e-4aa1-96cb-552cb1632c72 #开发环境
- cluster-name: DEFAULT #集群的名称(默认为DEFAULT)
TIPS: 集群作为实例的隔离,同一个集群的实例才能互相感知。
TIPS: namepsace,cluster-name 如果不填写将会采用默认值,namespace的默认命名空间public,cluster-name的默认值是DEFAULT集群
在配置里指定命名空间和集群后,重启实例。
此时可以看到dev下面注册了provider服务,并且该服务下包含一个TEST集群

开发者或者运维人员往往需要在服务注册后,通过友好的界面来查看服务的注册情况,包括当前系统注册的所有服务和每个服务的详情。并在有权限控制的情况下,进行服务的一些配置的编辑操作。Nacos在目前最新版本开放的控制台的服务发现部分,主要就是提供用户一个基本的运维页面,能够查看、编辑当前注册的服务,这些功能集中在Nacos控制台的服务管理一级菜单内。
服务列表帮助用户以统一的视图管理其所有的微服务以及服务健康状态。整体界面布局是左上角有服务的搜索框和搜索按钮,页面中央是服务列表的展示。服务列表主要展示服务名、集群数目、实例数目、健康实例数目和详情按钮五个栏目。

在服务列表页面点击详情,可以看到服务的详情。可以查看服务、集群和实例的基本信息。
Nacos 为用户提供了流量权重控制的能力,同时开放了服务流量的阈值保护,以帮助用户更好的保护服务服务提供者集群不被意外打垮。如下图所以,可以点击实例的编辑按钮,修改实例的权重。如果想增加实例的流量,可以将权重调大,如果不想实例接收流量,则可以将权重设为0。
Nacos提供多个维度的服务元数据的暴露,帮助用户存储自定义的信息。这些信息都是以K-V的数据结构存储,在控制台上,会以k1=v1,k2=v2这样的格式展示。类似的,编辑元数据可以通过相同的格式进行。例如服务的元数据编辑,首先点击服务详情页右上角的“编辑服务”按钮,然后在元数据输入框输入:version=1.0
点击确认,就可以在服务详情页面,看到服务的元数据已经更新了。

Nacos还提供服务实例的上下线操作,在服务详情页面,可以点击实例的“上线”或者“下线”按钮,被下线的实例,将不会包含在健康的实例列表里。

上下线测试:
(1)分别启动快速上手中的quickstart-consumer与quickstart-provider工程,更改quickstart-provide中的启动端口,再次启动quickstart-provider,让quickstart-provider服务拥有两个实例。

(2)多次访问http://127.0.0.1:56020/service ,让consumer调用provider时触发负载均衡。
(3)观察provider的2个实例控制台,可发现实例调用被均匀负载。
(4)在provider的服务详情页面,让某实例下线。

(5)多次访问http://127.0.0.1:56020/service ,观察控制台,发现下线的实例已不再接收流量。
(6)在provider的服务详情页面,让该实例恢复上线状态。
(7)多次访问http://127.0.0.1:56020/service ,观察控制台,发现恢复上线的实例已恢复流量访问。
启动quickstart-provider两个实例。


请求http://127.0.0.1:56020/service测试负载均衡。
跟踪quickstart-provider两个实例的控制台的日志输出,默认负载均衡策略是轮询。
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-alibaba-dependenciesartifactId>
- <version>2021.0.1.0version>
- <type>pomtype>
- <scope>importscope>
- dependency>
- <dependency>
- <groupId>org.springframework.cloudgroupId>
- <artifactId>spring-cloud-dependenciesartifactId>
- <version>2021.0.1version>
- <type>pomtype>
- <scope>importscope>
- dependency>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-dependenciesartifactId>
- <version>2.6.3version>
- <type>pomtype>
- <scope>importscope>
- dependency>
- dependencies>
- dependencyManagement>
-
- <dependencies>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-webartifactId>
- dependency>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-testartifactId>
- <scope>testscope>
- dependency>
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
- dependency>
- <dependency>
- <groupId>org.springframework.cloudgroupId>
- <artifactId>spring-cloud-starter-openfeignartifactId>
- dependency>
- dependencies>
-
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
- import org.springframework.cloud.openfeign.EnableFeignClients;
-
- @SpringBootApplication
- @EnableDiscoveryClient
- @EnableFeignClients
- public class StartUp {
- public static void main(String[] args) {
- SpringApplication.run(StartUp.class, args);
- }
- }
-
- server.port=8090
-
- spring.application.name=test-naocs
- spring.cloud.nacos.discovery.server-addr=8.131.239.157:8848
- spring.cloud.nacos.discovery.namespace=053a04db-74b3-46da-9a4e-09a4f0a5f88a
- spring.cloud.nacos.discovery.group=test
-
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
-
- @RequestMapping("/health")
- @RestController
- public class HealthController {
-
- @GetMapping("/check")
- public String check() {
- return "success";
- }
- }
-
- @FeignClient(name = "test-naocs")
- public interface ProviderClient {
- @GetMapping("/health/check")
- String service();
- }
| 配置项 | Key | 默认值 | 说明 |
|---|---|---|---|
| 地址 | spring.cloud.nacos.discovery.server-addr | 无 | NacosServer 启动监听的ip地址和端口 |
| 服务名 | spring.cloud.nacos.discovery.service | ${spring.application.name} | 给当前的服务命名 |
| 服务分组 | spring.cloud.nacos.discovery.group | DEFAULT_GROUP | 设置服务所处的分组 |
| 权重 | spring.cloud.nacos.discovery.weight | 1 | 取值范围 1 到 100,数值越大,权重越大 |
| 网卡名 | spring.cloud.nacos.discovery.network-interface | 无 | 当IP未配置时,注册的IP为此网卡所对应的IP地址,如果此项也未配置,则默认取第一块网卡的地址 |
| 注册的IP地址 | spring.cloud.nacos.discovery.ip | 无 | 优先级最高 |
| 注册的端口 | spring.cloud.nacos.discovery.port | -1 | 默认情况下不用配置,会自动探测 |
| 命名空间 | spring.cloud.nacos.discovery.namespace | 无 | 常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生 产环境的资源(如配置、服务)隔离等。 |
| AccessKey | spring.cloud.nacos.discovery.access-key | 无 | 当要上阿里云时,阿里云上面的一个云账号名 |
| SecretKey | spring.cloud.nacos.discovery.secret-key | 无 | 当要上阿里云时,阿里云上面的一个云账号密码 |
| Metadata | spring.cloud.nacos.discovery.metadata | 无 | 使用Map格式配置,用户可以根据自己的需要自定义一些和服务相关 的元数据信息 |
| 日志文件名 | spring.cloud.nacos.discovery.log-name | 无 | |
| 集群 | spring.cloud.nacos.discovery.cluster-name | DEFAULT | 配置成Nacos集群名称 |
| 接入点 | spring.cloud.nacos.discovery.enpoint | UTF-8 | 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址 |
是否集成Ribbon | ribbon.nacos.enabled | true | 一般都设置成true即可 |
是否开启NacosWatch | spring.cloud.nacos.discovery.watch.enabled | true | 可以设置成false来关闭 watch |