• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
isuning
博客园    首页    新随笔    联系   管理    订阅  订阅
Spring Cloud系列教程之Spring Cloud 阿里巴巴 Nacos 发现

Nacos 是一个易于使用的动态服务发现、配置和服务管理平台,用于构建云原生应用程序。

借助 Spring Cloud Alibaba Nacos Discovery,您可以快速访问基于 Spring Cloud 编程模型的 Nacos 服务注册功能。

服务注册/发现:Nacos Discovery

服务发现是微服务架构中的关键组件之一。在这样的架构中,手动为每个客户端配置服务列表可能是一项艰巨的任务,并且使动态扩展变得极其困难。Nacos Discovery 帮助您将服务自动注册到 Nacos 服务器,Nacos 服务器会跟踪服务并动态刷新服务列表。此外,Nacos Discovery 将服务实例的一些元数据,如主机、端口、健康检查 URL、主页等注册到 Nacos。关于如何下载和启动 Nacos,请参考Nacos 官网。

如何引入 Nacos Discovery 进行服务注册/发现

请使用组 ID 为com.alibaba.cloud和工件 ID 为的启动器spring-cloud-starter-alibaba-nacos-discovery。

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

使用 Nacos Discovery 进行服务注册/发现和调用的示例

Nacos Discovery 与 Netflix Ribbon 集成,RestTemplate 或 OpenFeign 可用于服务到服务调用。

Nacos 服务器启动

关于如何下载和启动 Nacos,请参考Nacos 官网。

Nacos Server启动后,到http://ip:8848查看控制台(默认账号名/密码为nacos/nacos):

TB1XEfwbQH0gK0jSZPiXXavapXa 2790 1060

图 1. Nacos 仪表板

更多 Nacos Server 版本,您可以从发布页面下载最新版本。

启动提供程序应用程序

以下示例说明了如何向 Nacos 注册服务。

  • pom.xml的配置 下面是一个完整的pom.xml示例:

pom.xml

<?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>open.source.test</groupId>
    <artifactId>nacos-discovery-test</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>nacos-discovery-test</name>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>${spring.boot.version}</version>
        <relativePath/>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring.cloud.alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
  • application.properties的配置 Nacos的一些基本配置必须包含在application.properties(或application.yaml)中,如下图:

应用程序属性

server.port=8081
spring.application.name=nacos-provider
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
management.endpoints.web.exposure.include=*

如果不想使用 Nacos 进行服务注册和发现,可以设置spring.cloud.nacos.discovery为false

  • 以下是启动 Provider 的示例:
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosProviderDemoApplication.class, args);
    }

    @RestController
    public class EchoController {
        @GetMapping(value = "/echo/{string}")
        public String echo(@PathVariable String string) {
            return "Hello Nacos Discovery " + string;
        }
    }
}

现在您可以在 Nacos 控制台上看到已注册的服务。

启动消费者应用程序

它可能不像启动提供者应用程序那么容易,因为消费者需要调用提供者的 RESTful 服务。在本例中,我们将使用最原始的方式,即显式结合 LoadBalanceClient 和 RestTemolate 来访问 RESTful 服务。pom.xml 和 application.properties 的配置可以参考 1.2 节。以下是启动消费者应用程序的示例代码。

@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApp {

    @RestController
    public class NacosController{

        @Autowired
        private LoadBalancerClient loadBalancerClient;
        @Autowired
        private RestTemplate restTemplate;

        @Value("${spring.application.name}")
        private String appName;

        @GetMapping("/echo/app-name")
        public String echoAppName(){
            //Access through the combination of LoadBalanceClient and RestTemplate
            ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-provider");
            String path = String.format("http://%s:%s/echo/%s",serviceInstance.getHost(),serviceInstance.getPort(),appName);
            System.out.println("request path:" +path);
            return restTemplate.getForObject(path,String.class);
        }

    }

    //Instantiate RestTemplate Instance
    @Bean
    public RestTemplate restTemplate(){

        return new RestTemplate();
    }

    public static void main(String[] args) {

        SpringApplication.run(NacosConsumerApp.class,args);
    }
}

在这个例子中,我们注入了一个 LoadBalancerClient 实例,并手动实例化了一个 RestTemplate。同时,我们将 的配置值注入spring.application.name到应用程序中,以便在调用提供者的服务时可以显示当前的应用程序名称。

接下来,访问http://ip:port/echo/app-name消费者提供的接口。这里我们启动了8082的端口,访问结果如下图:

地址:http://127.0.0.1:8082/echo/app-name
访问结果: 你好 Nacos Discovery nacos-consumer

Nacos 发现端点

Nacos Discovery 在内部提供了一个 Endpoint,对应的端点 id 为nacos-discovery.

端点暴露的 json 包含两个属性:

  1. subscribe:显示当前服务订阅者
  2. NacosDiscoveryProperties:显示当前服务的当前基本 Nacos 配置

以下显示了服务实例如何访问 Endpoint:

{
  "subscribe": [
    {
      "jsonFromServer": "",
      "name": "nacos-provider",
      "clusters": "",
      "cacheMillis": 10000,
      "hosts": [
        {
          "instanceId": "30.5.124.156#8081#DEFAULT#nacos-provider",
          "ip": "30.5.124.156",
          "port": 8081,
          "weight": 1.0,
          "healthy": true,
          "enabled": true,
          "cluster": {
            "serviceName": null,
            "name": null,
            "healthChecker": {
              "type": "TCP"
            },
            "defaultPort": 80,
            "defaultCheckPort": 80,
            "useIPPort4Check": true,
            "metadata": {

            }
          },
          "service": null,
          "metadata": {

          }
        }
      ],
      "lastRefTime": 1541755293119,
      "checksum": "e5a699c9201f5328241c178e804657e11541755293119",
      "allIPs": false,
      "key": "nacos-provider",
      "valid": true
    }
  ],
  "NacosDiscoveryProperties": {
    "serverAddr": "127.0.0.1:8848",
    "endpoint": "",
    "namespace": "",
    "logName": "",
    "service": "nacos-provider",
    "weight": 1.0,
    "clusterName": "DEFAULT",
    "metadata": {

    },
    "registerEnabled": true,
    "ip": "30.5.124.201",
    "networkInterface": "",
    "port": 8082,
    "secure": false,
    "accessKey": "",
    "secretKey": ""
  }
}

有关 Nacos Discovery Starter 配置的更多信息

下面是 Nacos Discovery 的 starter 的其他配置:

配置钥匙默认值描述
服务器地址spring.cloud.nacos.discovery.server-addrNacos Server监听的IP和端口
服务名称spring.cloud.nacos.discovery.service${spring.application.name}命名当前服务
重量spring.cloud.nacos.discovery.weight1取值范围:1~100,数值越大,权重越大
网卡名称spring.cloud.nacos.discovery.network-interface如果不指定IP地址,则注册的IP地址为网卡的IP地址。如果也没有指定,则默认使用第一块网卡的 IP 地址。
注册IP地址spring.cloud.nacos.discovery.ip最高优先级
注册端口spring.cloud.nacos.discovery.port-1默认会自动检测。不需要配置。
命名空间spring.cloud.nacos.discovery.namespace一个典型的场景是隔离不同环境的服务注册,例如测试和生产环境之间的资源(配置、服务等)隔离
访问密钥spring.cloud.nacos.discovery.access-key阿里云账号accesskey
密钥spring.cloud.nacos.discovery.secret-key阿里云账号秘钥
元数据spring.cloud.nacos.discovery.metadata您可以以 Map 格式为您的服务定义一些元数据
日志文件名spring.cloud.nacos.discovery.log-name
集群名称spring.cloud.nacos.discovery.cluster-nameDEFAULTNacos的集群名称
端点spring.cloud.nacos.discovery.endpoint特定区域中某项服务的域名。您可以使用此域名动态检索服务器地址
是否集成 Ribbonribbon.nacos.enabledtrue在大多数情况下设置为 true
启用 Nacos Watchspring.cloud.nacos.discovery.watch.enabledtrue设置为 false 关闭手表
posted on 2022-05-01 22:17  吕布辕门  阅读(131)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3