Spring Cloud Alibaba 参考文档(2)—— 服务发现 Nacos Discovery

1. Spring Cloud Alibaba 服务发现 Nacos

Nacos是一个易于使用的动态服务发现、配置和服务管理平台,用于构建云本地应用程序。
通过Spring Cloud Alibaba Nacos Discovery,您可以基于Spring Cloud的编程模型快速使用Nacos服务注册特性。

1.1. 服务注册/发现:Nocas Discovery

服务发现(Service Discovery)是微服务架构中的关键组件。在微服务架构中,为每个客户端手动配置服务列表是一个艰巨的任务,并且这限制了架构的弹性。Nacos Discovery 帮助你将你的服务自动注册到 Nacos 服务器而且 Nacos 服务器会跟踪服务并动态刷新服务列表。此外, Nacos Discovery 注册服务实例的一些属性,比如host, port, 健康检查URL, Nacos主页。关于下载和启动Nacos的详细介绍,参考Nacos网站

1.2. 如何为服务注册/发现引入 Nacos Discovery

请使用以下starter

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

1.3. 一个使用 Nacos Discovery 实现服务注册/发现和调用的例子

1.3.1。 启动 Nacos 服务

关于下载和启动Nacos的详细介绍,参考Nacos网站
Nacos 服务启动之后,访问http://ip:8848进入到管理后台页面(默认用户名/密码为nacos/nacos)。
image.png
图1. Nacos 管理页
更多Nacos服务的版本,可从 release page获取

1.3.2 启动 Provider 应用(服务提供者)

以下例子阐述了如何向 Nacos 注册一个服务

  • 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的一些必要的基础配置:
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 控制台看到上面注册的服务。

注意:启动 provider 应用之前请先启动Nacos.详情参考Nacos 网站

1.3.3. 启动 Consumer 应用(服务消费者)

相比于启动一个Provider应用,启动一个Consuner应用要复杂一些,因为Consumer需要调用Provider的 RESTFul 服务。在这个例子中,我们将使用最原始的调用方式,即显示地组合负载均衡客户端(LoadBalanceClient)和 RestTemplate 来访问 RESTFul 服务。 你可以参考 3.1.2 的 pom.xml 和 application.properties 配置。以下是一段启动 Consumer 应用的示例代码。

注意:你也可以使用 RestTemplate 和 FeignClient 访问服务。

@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的配置属性, 这样在调用 Provider 服务时我们就可以显示当前应用名称(application name)。

注意:启动 Consumer 应用之前请先启动Nacos.详情参考Nacos 网站

下一步,访问 Consumer 应用提供的 http://ip:port/echo/app-name 接口。这里我们使用的端口为8082.访问结果如下:

Address:http://127.0.0.1:8082/echo/app-name Access result: Hello Nacos Discovery nacos-consumer

1.4. Nacos Discovery Endpoint(端点)

Nacos Discovery 内部提供了一个带有对应端点ID(Endpoint ID)的端点(Endpoint)。
端点暴露的 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": "" } }

1.5. 更多关于 Nacos Discovery Starter 的配置信息

下面展示了 Nacos Discovery Starter 的配置信息:

Configuration Key Default value Description
Server address spring.cloud.nacos.discovery.server-addr IP and port of the Nacos Server listener
Service name spring.cloud.nacos.discovery.service ${spring.application.name} Name the current service
Weight spring.cloud.nacos.discovery.weight 1 Value range: 1 to 100. The bigger the value, the greater the weight
Network card name spring.cloud.nacos.discovery.network-interface If the IP address is not specified, the registered IP address is the IP address of the network card. If this is not specified either, the IP address of the first network card will be used by default.
Registered IP address spring.cloud.nacos.discovery.ip Highest priority
Registered port spring.cloud.nacos.discovery.port -1 Will be detected automatically by default. Do not need to be configured.
Namespace spring.cloud.nacos.discovery.namespace A typical scenario is to isolate the service registration for different environment, such as resource (configurations, services etc.) isolation between testing and production environment
AccessKey spring.cloud.nacos.discovery.access-key Alibaba Cloud account accesskey
SecretKey spring.cloud.nacos.discovery.secret-key Alibaba Cloud account secretkey
Metadata spring.cloud.nacos.discovery.metadata You can define some of the metadata for your services in the Map format
Log file name spring.cloud.nacos.discovery.log-name
Cluster Name spring.cloud.nacos.discovery.cluster-name DEFAULT Cluster name of Nacos
Endpoint spring.cloud.nacos.discovery.endpoint The domain name of a certain service in a specific region. You can retrieve the server address dynamically with this domain name
Integrate Ribbon or not ribbon.nacos.enabled true Set to true in most cases
Enable Nacos Watch spring.cloud.nacos.discovery.watch.enabled true set to false to close watch
阅读(305)
评论(0)
updated@2020-12-02
评论区
目录