安装Nacos

推荐使用官网教程进行安装,也可以直接使用我的docker安装教程

接入Nacos注册中心

完成Nacos安装后,编写程序接入注册中心。

服务提供者

第一步:创建SpringBoot应用(模块),命名为alibaba-nacos-discovery-server
第二步:编辑pom.xml,加入依赖:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.example</groupId>
  6. <artifactId>alibaba-nacos-discovery-server</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9. <properties>
  10. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  11. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  12. <java.version>11</java.version>
  13. <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
  14. <spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
  15. <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
  16. </properties>
  17. <dependencyManagement>
  18. <dependencies>
  19. <dependency>
  20. <groupId>org.springframework.cloud</groupId>
  21. <artifactId>spring-cloud-dependencies</artifactId>
  22. <version>${spring-cloud.version}</version>
  23. <type>pom</type>
  24. <scope>import</scope>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-dependencies</artifactId>
  29. <version>${spring-boot.version}</version>
  30. <type>pom</type>
  31. <scope>import</scope>
  32. </dependency>
  33. <dependency>
  34. <groupId>com.alibaba.cloud</groupId>
  35. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  36. <version>${spring-cloud-alibaba.version}</version>
  37. <type>pom</type>
  38. <scope>import</scope>
  39. </dependency>
  40. </dependencies>
  41. </dependencyManagement>
  42. <dependencies>
  43. <dependency>
  44. <groupId>org.springframework.boot</groupId>
  45. <artifactId>spring-boot-starter-web</artifactId>
  46. </dependency>
  47. <dependency>
  48. <groupId>com.alibaba.cloud</groupId>
  49. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  50. </dependency>
  51. <!--<dependency>
  52. <groupId>org.springframework.cloud</groupId>
  53. <artifactId>spring-cloud-starter-openfeign</artifactId>
  54. </dependency>-->
  55. <dependency>
  56. <groupId>org.projectlombok</groupId>
  57. <artifactId>lombok</artifactId>
  58. <optional>true</optional>
  59. </dependency>
  60. <dependency>
  61. <groupId>org.springframework.boot</groupId>
  62. <artifactId>spring-boot-starter-test</artifactId>
  63. <scope>test</scope>
  64. </dependency>
  65. </dependencies>
  66. <build>
  67. <plugins>
  68. <plugin>
  69. <groupId>org.springframework.boot</groupId>
  70. <artifactId>spring-boot-maven-plugin</artifactId>
  71. <configuration>
  72. <excludes>
  73. <exclude>
  74. <groupId>org.projectlombok</groupId>
  75. <artifactId>lombok</artifactId>
  76. </exclude>
  77. </excludes>
  78. </configuration>
  79. </plugin>
  80. </plugins>
  81. </build>
  82. </project>

注意SpringBoot与SpringCloud的版本需要对应,否则会无法启动,点击这里查看版本对应关系。

第三步:创建主类,实现一个Http接口

  1. package com.example.demo;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.PathVariable;
  8. import org.springframework.web.bind.annotation.RestController;
  9. @EnableDiscoveryClient
  10. @SpringBootApplication
  11. public class AlibabaNacosDiscoveryServerApplication {
  12. public static void main(String[] args) {
  13. SpringApplication.run(AlibabaNacosDiscoveryServerApplication.class, args);
  14. }
  15. @Slf4j
  16. @RestController
  17. static class TestController {
  18. @GetMapping("/echo/{message}")
  19. public String hello(@PathVariable String message){
  20. log.info("invoke message = {}", message);
  21. return "[echo] : " + message;
  22. }
  23. }
  24. }

@SpringBootApplication定义SpringBoot应用,@EnableDiscoveryClient开启SpringCloud的服务注册与发现。

第四步:编辑application.properties,配置服务名称和Nacos地址

  1. spring.application.name=alibaba-nacos-discovery-server
  2. server.port=8001
  3. spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

第五步:启动应用。
在应用启动好之后,可以在控制台看到如下内容,说明注册成功:

  1. INFO 18826 --- [ main] c.a.c.n.registry.NacosServiceRegistry : nacos registry, DEFAULT_GROUP alibaba-nacos-discovery-server 192.168.31.174:8001 register finished

启动好之后,可以在Nacos管理页面http://127.0.0.1:8848/nacos的「服务管理」-「服务列表」看到刚注册的服务:
image.png

服务消费者

第一步:创建SpringBoot应用(模块),命名为alibaba-nacos-discovery-client-common
第二步:编辑pom.xml,加入依赖:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.example</groupId>
  6. <artifactId>alibaba-nacos-discovery-client-common</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <name>alibaba-nacos-discovery-client-common</name>
  9. <description>Demo project for Spring Boot</description>
  10. <properties>
  11. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  12. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  13. <java.version>11</java.version>
  14. <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
  15. <spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
  16. <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
  17. </properties>
  18. <dependencyManagement>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.cloud</groupId>
  22. <artifactId>spring-cloud-dependencies</artifactId>
  23. <version>${spring-cloud.version}</version>
  24. <type>pom</type>
  25. <scope>import</scope>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework.boot</groupId>
  29. <artifactId>spring-boot-dependencies</artifactId>
  30. <version>${spring-boot.version}</version>
  31. <type>pom</type>
  32. <scope>import</scope>
  33. </dependency>
  34. <dependency>
  35. <groupId>com.alibaba.cloud</groupId>
  36. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  37. <version>${spring-cloud-alibaba.version}</version>
  38. <type>pom</type>
  39. <scope>import</scope>
  40. </dependency>
  41. </dependencies>
  42. </dependencyManagement>
  43. <dependencies>
  44. <dependency>
  45. <groupId>org.springframework.boot</groupId>
  46. <artifactId>spring-boot-starter-web</artifactId>
  47. </dependency>
  48. <dependency>
  49. <groupId>com.alibaba.cloud</groupId>
  50. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  51. </dependency>
  52. <dependency>
  53. <groupId>org.projectlombok</groupId>
  54. <artifactId>lombok</artifactId>
  55. <optional>true</optional>
  56. </dependency>
  57. <dependency>
  58. <groupId>org.springframework.boot</groupId>
  59. <artifactId>spring-boot-starter-test</artifactId>
  60. <scope>test</scope>
  61. </dependency>
  62. </dependencies>
  63. <build>
  64. <plugins>
  65. <plugin>
  66. <groupId>org.springframework.boot</groupId>
  67. <artifactId>spring-boot-maven-plugin</artifactId>
  68. <configuration>
  69. <excludes>
  70. <exclude>
  71. <groupId>org.projectlombok</groupId>
  72. <artifactId>lombok</artifactId>
  73. </exclude>
  74. </excludes>
  75. </configuration>
  76. </plugin>
  77. </plugins>
  78. </build>
  79. </project>

第三步:创建主类,实现一个Http接口

  1. package com.example.alibabanacosdiscoveryclientcommon;
  2. import lombok.AllArgsConstructor;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.SpringApplication;
  6. import org.springframework.boot.autoconfigure.SpringBootApplication;
  7. import org.springframework.cloud.client.ServiceInstance;
  8. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  9. import org.springframework.cloud.client.loadbalancer.LoadBalanced;
  10. import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
  11. import org.springframework.context.annotation.Bean;
  12. import org.springframework.web.bind.annotation.GetMapping;
  13. import org.springframework.web.bind.annotation.PathVariable;
  14. import org.springframework.web.bind.annotation.RestController;
  15. import org.springframework.web.client.RestTemplate;
  16. @EnableDiscoveryClient
  17. @SpringBootApplication
  18. public class AlibabaNacosDiscoveryClientCommonApplication {
  19. public static void main(String[] args) {
  20. SpringApplication.run(AlibabaNacosDiscoveryClientCommonApplication.class, args);
  21. }
  22. @Slf4j
  23. @RestController
  24. static class RestTemplateController {
  25. @LoadBalanced
  26. @Bean
  27. public RestTemplate restTemplate() {
  28. return new RestTemplate();
  29. }
  30. @Autowired
  31. @LoadBalanced
  32. private RestTemplate restTemplate;
  33. @GetMapping("call/echo/{message}")
  34. public String callEcho(@PathVariable String message) {
  35. // 已经注册的应用的名称
  36. String serverName = "alibaba-nacos-discovery-server";
  37. String url = "http://"+ serverName +"/echo/" + message;
  38. return restTemplate.getForObject(url, String.class);
  39. }
  40. }
  41. }

这里使用RestTemplate向实例发起HTTP请求,定义RestTemplate的时候,使用@LoadBalanced注解,这样在调用服务接口时,只需要拼接上实例名称和请求路径。而SpringCloud会通过负载均衡选出具体的节点来执行请求。

第四步:编辑application.properties,配置服务名称和Nacos地址

  1. spring.application.name=alibaba-nacos-discovery-client-common
  2. server.port=9001
  3. spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

第五步:启动服务消费者,然后通过curl发起访问:

  1. $ curl http://localhost:9001/call/echo/something
  2. [echo] : something%

代码示例

  • Github:
  • Gitee: