物联网架构成长之路(51)-Nacos微服务配置中心、服务注册服务发现
0.前言
之前练习微服务是用Eureka,最近发现BladeX是用的Nacos,发现Nacos还比较简单实用。所以练习一下这个,为物联网V2版本积累经验。
1. 下载、安装、启动
下载Nacos
1 https://github.com/alibaba/nacos/releases 2 https://nacos.io/zh-cn/docs/quick-start.html
解压启动
访问http://127.0.0.1:8848/nacos/index.html
默认帐号密码 nacos/nacos
2. Nacos作为配置中心
参考官方文档,实现nacos-config
https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-docs/src/main/asciidoc/nacos-config.adoc
注意,springcloud使用配置中心,那么配置文件是对应的 bootstrap.properties
bootstrap.properties
1 spring.cloud.nacos.config.server-addr=127.0.0.1:8848 2 spring.cloud.nacos.config.prefix=example 3 spring.profiles.active=demo 4 spring.cloud.nacos.config.file-extension=properties 5 6 # ${prefix}-${spring.profile.active}.${file-extension} 7 # example-demo.properties
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 <parent> 6 <groupId>org.springframework.boot</groupId> 7 <artifactId>spring-boot-starter-parent</artifactId> 8 <version>2.2.2.RELEASE</version> 9 <relativePath/> <!-- lookup parent from repository --> 10 </parent> 11 <groupId>com.wunaozai.demo</groupId> 12 <artifactId>NacosConfig</artifactId> 13 <version>0.0.1-SNAPSHOT</version> 14 <name>NacosConfig</name> 15 <description>Nacos配置中心</description> 16 17 <properties> 18 <java.version>1.8</java.version> 19 <spring-cloud-alibaba.version>2.2.0.RELEASE</spring-cloud-alibaba.version> 20 <maven-jar-plugin.version>3.0.0</maven-jar-plugin.version> 21 </properties> 22 23 <dependencies> 24 <dependency> 25 <groupId>org.springframework.boot</groupId> 26 <artifactId>spring-boot-starter-web</artifactId> 27 </dependency> 28 <dependency> 29 <groupId>com.alibaba.cloud</groupId> 30 <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> 31 </dependency> 32 <dependency> 33 <groupId>com.google.guava</groupId> 34 <artifactId>guava</artifactId> 35 <version>15.0</version> 36 <scope>compile</scope> 37 </dependency> 38 39 <dependency> 40 <groupId>org.springframework.boot</groupId> 41 <artifactId>spring-boot-devtools</artifactId> 42 <scope>runtime</scope> 43 <optional>true</optional> 44 </dependency> 45 <dependency> 46 <groupId>org.springframework.boot</groupId> 47 <artifactId>spring-boot-starter-test</artifactId> 48 <scope>test</scope> 49 <exclusions> 50 <exclusion> 51 <groupId>org.junit.vintage</groupId> 52 <artifactId>junit-vintage-engine</artifactId> 53 </exclusion> 54 </exclusions> 55 </dependency> 56 </dependencies> 57 58 <dependencyManagement> 59 <dependencies> 60 <dependency> 61 <groupId>com.alibaba.cloud</groupId> 62 <artifactId>spring-cloud-alibaba-dependencies</artifactId> 63 <version>${spring-cloud-alibaba.version}</version> 64 <type>pom</type> 65 <scope>import</scope> 66 </dependency> 67 </dependencies> 68 </dependencyManagement> 69 70 <repositories> 71 <repository> 72 <id>maven-ali</id> 73 <url>http://maven.aliyun.com/nexus/content/groups/public//</url> 74 <releases> 75 <enabled>true</enabled> 76 </releases> 77 <snapshots> 78 <enabled>true</enabled> 79 <updatePolicy>always</updatePolicy> 80 <checksumPolicy>fail</checksumPolicy> 81 </snapshots> 82 </repository> 83 </repositories> 84 85 <build> 86 <plugins> 87 <plugin> 88 <groupId>org.springframework.boot</groupId> 89 <artifactId>spring-boot-maven-plugin</artifactId> 90 </plugin> 91 </plugins> 92 </build> 93 94 </project>
NacosConfigApplication.java
1 package com.wunaozai.demo; 2 3 import org.springframework.boot.SpringApplication; 4 import org.springframework.boot.autoconfigure.SpringBootApplication; 5 import org.springframework.context.ConfigurableApplicationContext; 6 7 @SpringBootApplication 8 public class NacosConfigApplication { 9 10 public static void main(String[] args) { 11 ConfigurableApplicationContext context = 12 SpringApplication.run(NacosConfigApplication.class, args); 13 String username = context.getEnvironment().getProperty("user.name"); 14 String userage = context.getEnvironment().getProperty("user.age"); 15 System.out.println("user.name=" + username + " " + "user.age=" + userage); 16 } 17 18 }
NacosController.java
1 package com.wunaozai.demo.controller; 2 3 import org.springframework.beans.factory.annotation.Value; 4 import org.springframework.cloud.context.config.annotation.RefreshScope; 5 import org.springframework.web.bind.annotation.RequestMapping; 6 import org.springframework.web.bind.annotation.RestController; 7 8 @RefreshScope 9 @RestController 10 @RequestMapping(value="/nacos") 11 public class NacosController { 12 13 @Value("${str:---}") 14 private String str; 15 16 @RequestMapping(value="/get") 17 public String get() { 18 return str; 19 } 20 }
然后在nacos管理界面上配置如下信息
1 user.name=demo 2 user.age=99 3 server.port=9988 4 str=wunaozai
配置后,启动NacosConfig服务,并访问浏览器,效果如下。
修改nacos上的配置文件后,保存。程序会自动更新配置。
3. Nacos作为服务中心,服务注册与服务发现
3.1 服务提供者Provider
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 <parent> 6 <groupId>org.springframework.boot</groupId> 7 <artifactId>spring-boot-starter-parent</artifactId> 8 <version>2.2.5.RELEASE</version> 9 <relativePath/> <!-- lookup parent from repository --> 10 </parent> 11 <groupId>com.wunaozai.demo</groupId> 12 <artifactId>NacosDiscoveryProvider</artifactId> 13 <version>0.0.1-SNAPSHOT</version> 14 <name>NacosDiscoveryProvider</name> 15 <description>Nacos服务发现与注册</description> 16 17 <properties> 18 <java.version>1.8</java.version> 19 <spring-cloud-alibaba.version>2.2.0.RELEASE</spring-cloud-alibaba.version> 20 <maven-jar-plugin.version>3.0.0</maven-jar-plugin.version> 21 </properties> 22 23 <dependencies> 24 <dependency> 25 <groupId>org.springframework.boot</groupId> 26 <artifactId>spring-boot-starter-web</artifactId> 27 </dependency> 28 <dependency> 29 <groupId>com.alibaba.cloud</groupId> 30 <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> 31 </dependency> 32 <dependency> 33 <groupId>org.springframework.boot</groupId> 34 <artifactId>spring-boot-starter-actuator</artifactId> 35 </dependency> 36 <dependency> 37 <groupId>com.google.guava</groupId> 38 <artifactId>guava</artifactId> 39 <version>15.0</version> 40 <scope>compile</scope> 41 </dependency> 42 43 <dependency> 44 <groupId>org.springframework.boot</groupId> 45 <artifactId>spring-boot-devtools</artifactId> 46 <scope>runtime</scope> 47 <optional>true</optional> 48 </dependency> 49 <dependency> 50 <groupId>org.springframework.boot</groupId> 51 <artifactId>spring-boot-starter-test</artifactId> 52 <scope>test</scope> 53 <exclusions> 54 <exclusion> 55 <groupId>org.junit.vintage</groupId> 56 <artifactId>junit-vintage-engine</artifactId> 57 </exclusion> 58 </exclusions> 59 </dependency> 60 </dependencies> 61 62 <dependencyManagement> 63 <dependencies> 64 <dependency> 65 <groupId>com.alibaba.cloud</groupId> 66 <artifactId>spring-cloud-alibaba-dependencies</artifactId> 67 <version>${spring-cloud-alibaba.version}</version> 68 <type>pom</type> 69 <scope>import</scope> 70 </dependency> 71 </dependencies> 72 </dependencyManagement> 73 74 <build> 75 <plugins> 76 <plugin> 77 <groupId>org.springframework.boot</groupId> 78 <artifactId>spring-boot-maven-plugin</artifactId> 79 </plugin> 80 </plugins> 81 </build> 82 83 </project>
application.properites
1 server.port=8081 2 spring.application.name=nacos-provider 3 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
NacosProviderController.java
1 package com.wunaozai.demo; 2 3 import org.springframework.web.bind.annotation.RequestMapping; 4 import org.springframework.web.bind.annotation.RestController; 5 6 @RestController 7 @RequestMapping(value="/provider") 8 public class NacosProviderController { 9 10 @RequestMapping(value="/echo") 11 public String echo(String str) { 12 return "Hello Nacos Discovery: " + str; 13 } 14 }
NacosDiscoveryProviderApplication.java
1 package com.wunaozai.demo; 2 3 import org.springframework.boot.SpringApplication; 4 import org.springframework.boot.autoconfigure.SpringBootApplication; 5 import org.springframework.cloud.client.discovery.EnableDiscoveryClient; 6 7 @SpringBootApplication 8 @EnableDiscoveryClient 9 public class NacosDiscoveryProviderApplication { 10 11 public static void main(String[] args) { 12 SpringApplication.run(NacosDiscoveryProviderApplication.class, args); 13 } 14 15 }
3.2 服务消费者Consumer
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 <parent> 6 <groupId>org.springframework.boot</groupId> 7 <artifactId>spring-boot-starter-parent</artifactId> 8 <version>2.2.5.RELEASE</version> 9 <relativePath/> <!-- lookup parent from repository --> 10 </parent> 11 <groupId>com.wunaozai.demo</groupId> 12 <artifactId>NacosDiscoveryConsumer</artifactId> 13 <version>0.0.1-SNAPSHOT</version> 14 <name>NacosDiscoveryConsumer</name> 15 <description>Nacos服务注册与发现</description> 16 17 <properties> 18 <java.version>1.8</java.version> 19 <spring-cloud-alibaba.version>2.2.0.RELEASE</spring-cloud-alibaba.version> 20 <maven-jar-plugin.version>3.0.0</maven-jar-plugin.version> 21 </properties> 22 23 <dependencies> 24 <dependency> 25 <groupId>org.springframework.boot</groupId> 26 <artifactId>spring-boot-starter-web</artifactId> 27 </dependency> 28 <dependency> 29 <groupId>com.alibaba.cloud</groupId> 30 <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> 31 </dependency> 32 <dependency> 33 <groupId>com.google.guava</groupId> 34 <artifactId>guava</artifactId> 35 <version>15.0</version> 36 <scope>compile</scope> 37 </dependency> 38 39 <dependency> 40 <groupId>org.springframework.boot</groupId> 41 <artifactId>spring-boot-devtools</artifactId> 42 <scope>runtime</scope> 43 <optional>true</optional> 44 </dependency> 45 <dependency> 46 <groupId>org.springframework.boot</groupId> 47 <artifactId>spring-boot-starter-test</artifactId> 48 <scope>test</scope> 49 <exclusions> 50 <exclusion> 51 <groupId>org.junit.vintage</groupId> 52 <artifactId>junit-vintage-engine</artifactId> 53 </exclusion> 54 </exclusions> 55 </dependency> 56 </dependencies> 57 58 <dependencyManagement> 59 <dependencies> 60 <dependency> 61 <groupId>com.alibaba.cloud</groupId> 62 <artifactId>spring-cloud-alibaba-dependencies</artifactId> 63 <version>${spring-cloud-alibaba.version}</version> 64 <type>pom</type> 65 <scope>import</scope> 66 </dependency> 67 </dependencies> 68 </dependencyManagement> 69 70 <build> 71 <plugins> 72 <plugin> 73 <groupId>org.springframework.boot</groupId> 74 <artifactId>spring-boot-maven-plugin</artifactId> 75 </plugin> 76 </plugins> 77 </build> 78 79 </project>
application.properites
1 server.port=8083 2 spring.application.name=nacos-consumer 3 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
BeanConfig.java
1 package com.wunaozai.demo.config; 2 3 import org.springframework.cloud.client.loadbalancer.LoadBalanced; 4 import org.springframework.context.annotation.Bean; 5 import org.springframework.stereotype.Component; 6 import org.springframework.web.client.RestTemplate; 7 8 @Component 9 public class BeanConfig { 10 11 @LoadBalanced 12 @Bean 13 public RestTemplate restTemplate() { 14 return new RestTemplate(); 15 } 16 }
NacosConsumerController.java
1 package com.wunaozai.demo; 2 3 import org.springframework.beans.factory.annotation.Autowired; 4 import org.springframework.web.bind.annotation.GetMapping; 5 import org.springframework.web.bind.annotation.RequestMapping; 6 import org.springframework.web.bind.annotation.RestController; 7 import org.springframework.web.client.RestTemplate; 8 9 @RestController 10 @RequestMapping(value="/consumer") 11 public class NacosConsumerController { 12 13 @Autowired 14 private RestTemplate restTemplate; 15 16 @GetMapping(value="/echo") 17 public String getProviderEcho(String msg) { 18 return restTemplate.getForObject("http://nacos-provider/provider/echo?str=" + msg, String.class); 19 } 20 }
NacosDiscoveryConsumerApplication.java
1 package com.wunaozai.demo; 2 3 import org.springframework.boot.SpringApplication; 4 import org.springframework.boot.autoconfigure.SpringBootApplication; 5 import org.springframework.cloud.client.discovery.EnableDiscoveryClient; 6 7 @SpringBootApplication 8 @EnableDiscoveryClient 9 public class NacosDiscoveryConsumerApplication { 10 11 public static void main(String[] args) { 12 SpringApplication.run(NacosDiscoveryConsumerApplication.class, args); 13 } 14 15 }
浏览器访问结果
Nacos管理界面
参考资料:
https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-docs/src/main/asciidoc/nacos-config.adoc
https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-docs/src/main/asciidoc/nacos-discovery.adoc
https://www.jianshu.com/p/3e13272a9c84
附件代码下载: https://files.cnblogs.com/files/wunaozai/IoT-51-Nacos.zip
本文地址:https://www.cnblogs.com/wunaozai/p/12378485.html
本系列目录: https://www.cnblogs.com/wunaozai/p/8067577.html
个人主页:https://www.wunaozai.com/
作者:无脑仔的小明 出处:http://www.cnblogs.com/wunaozai/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 如果文中有什么错误,欢迎指出。以免更多的人被误导。有需要沟通的,可以站内私信,文章留言,或者关注“无脑仔的小明”公众号私信我。一定尽力回答。 |