物联网架构成长之路(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/

原文地址:https://www.cnblogs.com/wunaozai/p/12378485.html

时间: 2024-11-02 13:59:53

物联网架构成长之路(51)-Nacos微服务配置中心、服务注册服务发现的相关文章

物联网架构成长之路(56)-SpringCloudGateway+JWT实现网关鉴权

0. 前言 结合前面两篇博客,前面博客实现了Gateway网关的路由功能.此时,如果每个微服务都需要一套帐号认证体系就没有必要了.可以在网关处进行权限认证.然后转发请求到后端服务.这样后面的微服务就可以直接调用,而不需要每个都单独一套鉴权体系.参考了Oauth2和JWT,发现基于微服务,使用JWT会更方便一些,所以准备集成JWT作为微服务架构的认证方式. [https://www.cnblogs.com/wunaozai/p/12512753.html] 物联网架构成长之路(54)-基于Naco

物联网架构成长之路(0)-目录

一.基础 [http://www.cnblogs.com/wunaozai/p/8067621.html] 物联网架构成长之路(1)-前言 [http://www.cnblogs.com/wunaozai/p/8075640.html] 物联网架构成长之路(2)-脚手架工具准备 [http://www.cnblogs.com/wunaozai/p/8082332.html] 物联网架构成长之路(3)-EMQ消息服务器了解

物联网架构成长之路(30)-Spring Boot Admin微服务WebUI监控

0. 前言 一个完整的微服务解决方案包含了许多微服务,基于我们需要观察各个微服务的运行状态,因此Spring Boot 生态提供了Spring Boot Admin 这个组件来实现微服务管理WEB UI.但是整体的注册中心还是基于Eureka,只是WebUI是用这个Spring Boot Admin 来显示而已.具体的结构如下所示 1. Eureka服务 这个没什么好说的,按照创建一个微服务的流程,通过 Spring Starter 工具,自动生成一个Eureka微服务.主要就是配置Applic

物联网架构成长之路(24)-Docker练习之Compose容器编排

0.前言 一开始学的之后,是想一步到位直接上Kubernetes(K8s)的,后面没想到,好像有点复杂,有些概念不是很懂.因此学习东西还是要循序渐进,慢慢来.先了解单机编排技术Docker Compose,了解一些技术细节及原理后,在入手K8s.还是不能一口吃成胖子,要多吃几口才可以.而且目前公司都是一些小项目,能用得上DockerCompose已经很不错了,还想要上K8s,估计是不现实的. 1. 安装 可以通过运行下面命令进行安装, 1 curl -L https://github.com/d

物联网架构成长之路(16)-SpringCloud从入门到吹水

1.前言 Spring Cloud 现在比较流行,版本更新也是蛮快的,网上资料也是很多.很多参考网上资料就可以学到了.这里给个 http://blog.csdn.net/forezp/article/details/70148833 2.放弃 本来还想写一篇Spring Cloud 入门环境搭建的博客, 后来想了想,还是算了,网上资料一大堆.这里就不写了. 3.吹水 下面就简单聊聊天,吹吹水算了 2018.01.18 笔记 公司网速不行,在进行Maven项目以来更新,偷偷写一些经历. 现在开始学

物联网架构成长之路(11)-Redis缓存主从复制

1. 说明 在我的物联网平台框架框架中,会用到Redis这个中间件.作为EMQ权限认证的缓存.https://www.cnblogs.com/think-in-java/p/5123884.html 2. 编译&运行 1 wget http://download.redis.io/releases/redis-4.0.6.tar.gz 2 make && make test && make PREFIX=/home/user/workspace/redis inst

物联网架构成长之路(35)-利用Netty解析物联网自定义协议

一.前言 前面博客大部分介绍了基于EMQ中间件,通信协议使用的是MQTT,而传输的数据为纯文本数据,采用JSON格式.这种方式,大部分一看就知道是熟悉Web开发.软件开发的人喜欢用的方式.由于我也是做web软件开发的,也是比较喜欢这种方式.阿里的物联网平台,也是推荐这种方式.但是,但是做惯硬件开发,嵌入式开发就比较喜欢用裸TCP-Socket连接.采用的是二进制协议.基于此大部分应用场合为了兼容旧设备,就需要单独开发一个TCP服务器的网关.这里使用以前学过的,也是比较流行的Netty框架. 话不

物联网架构成长之路(12)-物联网架构小结1

1. 说明 这一小节,也不具体讲些什么了.最近一个半月都在摸鱼,没什么事做,慢慢学习着SpringBoot和SpringCloud.下面两张图是进行的一次小结.以后随着深入,整个架构肯定是会变的.现在记录一下,每个项目成长都是有一个过程的. 原文地址:https://www.cnblogs.com/wunaozai/p/8312891.html

物联网架构成长之路(32)-SpringBoot集成MQTT客户端

一.前言 这里虽然是说MQTT客户端.其实对于服务器来说,这里的一个具有超级权限的MQTT客户端,就可以做很多事情.比如手机APP或者网页或者第三方服务需要发送数据到设备,但是这些又不是设备,又不能让他们连到MQTT.那么就可以通过HTTP请求业务服务器.然后由业务服务器利用这个MQTT客户端进行发送数据. 还有,之前好多人问我,怎么保存这些物联网数据,真的要像前面的博客那样,要自己写插件吗?特别麻烦的啊.这里给出的结论是不需要.保存数据,除了写EMQ插件,还可以在EMQ的规则引擎上进行配置We