【springcloud alibaba】注册中心之nacos
1.1 没有注册中心会怎么样
3.案例项目父工程
4.1 单机版的使用
4.2 linux环境nacos集群部署
------------------------------------------------
1.为什么需要注册中心
1.1 没有注册中心会怎么样
微服务首先要解决是就是服务间的通信问题。而通信则需要知道ip和端口及暴露相应的接口。在单体应用中,直接写死ip和端口并拼接对应的暴露接口即可。而在服务应用中,需要考虑的是存在大量服务时手动维护服务列表是否合适?如果服务横向扩展时如何通知其他的服务?服务宕机后,如何及时下线等等问题。没有注册中心,这些都需要应用自己实现。
1.2 注册中心提供什么功能以及解决什么问题
注册中心提供服务注册与发现功能:动态的增减服务节点,服务节点增减后动态的通知服务消费者,而不需要由消费者来更新配置。
2.常用的微服务注册中心对比
Nacos PMC 朱鹏飞的主流微服务注册中心浅谈与对比一文,从数据模型、数据一致性、负载均衡、健康检查、性能与容灾、易用性及集群扩展性等方面,比较全面的对当下主流的注册中心zk、consul、Eureka、nacos作了比较,详细可点以上链接地址。
3.案例项目父工程
为了方便之后springcloud alibaba系统案例的开发,先弄一个父pom工程,统一版本号及相关maven插件。
具体pom如下,modules根据对应案例工程作相应更改。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 7 <groupId>cn.com.wjqhhuaxia</groupId> 8 <artifactId>springcloud-alibaba</artifactId> 9 <version>1.0-SNAPSHOT</version> 10 <modules> 11 <module>nocas-provider</module> 12 <module>nocas-consumer</module> 13 </modules> 14 <packaging>pom</packaging> 15 16 <!-- 统一管理jar包版本 --> 17 <properties> 18 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 19 <maven.compiler.source>1.8</maven.compiler.source> 20 <maven.compiler.target>1.8</maven.compiler.target> 21 <junit.version>4.12</junit.version> 22 <log4j.version>1.2.17</log4j.version> 23 <lombok.version>1.16.18</lombok.version> 24 <mysql.version>5.1.47</mysql.version> 25 <druid.version>1.1.16</druid.version> 26 <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version> 27 </properties> 28 29 <!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version --> 30 <dependencyManagement> 31 <dependencies> 32 <!--spring boot 2.2.2--> 33 <dependency> 34 <groupId>org.springframework.boot</groupId> 35 <artifactId>spring-boot-dependencies</artifactId> 36 <version>2.2.2.RELEASE</version> 37 <type>pom</type> 38 <scope>import</scope> 39 </dependency> 40 <!--spring cloud Hoxton.SR1--> 41 <dependency> 42 <groupId>org.springframework.cloud</groupId> 43 <artifactId>spring-cloud-dependencies</artifactId> 44 <version>Hoxton.SR1</version> 45 <type>pom</type> 46 <scope>import</scope> 47 </dependency> 48 <!--spring cloud alibaba 2.1.0.RELEASE--> 49 <dependency> 50 <groupId>com.alibaba.cloud</groupId> 51 <artifactId>spring-cloud-alibaba-dependencies</artifactId> 52 <version>2.1.0.RELEASE</version> 53 <type>pom</type> 54 <scope>import</scope> 55 </dependency> 56 57 <dependency> 58 <groupId>mysql</groupId> 59 <artifactId>mysql-connector-java</artifactId> 60 <version>${mysql.version}</version> 61 </dependency> 62 <dependency> 63 <groupId>com.alibaba</groupId> 64 <artifactId>druid</artifactId> 65 <version>${druid.version}</version> 66 </dependency> 67 <dependency> 68 <groupId>org.mybatis.spring.boot</groupId> 69 <artifactId>mybatis-spring-boot-starter</artifactId> 70 <version>${mybatis.spring.boot.version}</version> 71 </dependency> 72 <dependency> 73 <groupId>junit</groupId> 74 <artifactId>junit</artifactId> 75 <version>${junit.version}</version> 76 </dependency> 77 <dependency> 78 <groupId>log4j</groupId> 79 <artifactId>log4j</artifactId> 80 <version>${log4j.version}</version> 81 </dependency> 82 <dependency> 83 <groupId>org.projectlombok</groupId> 84 <artifactId>lombok</artifactId> 85 <version>${lombok.version}</version> 86 <optional>true</optional> 87 </dependency> 88 </dependencies> 89 </dependencyManagement> 90 91 <build> 92 <plugins> 93 <plugin> 94 <groupId>org.springframework.boot</groupId> 95 <artifactId>spring-boot-maven-plugin</artifactId> 96 <configuration> 97 <fork>true</fork> 98 <addResources>true</addResources> 99 </configuration> 100 </plugin> 101 </plugins> 102 </build> 103 104 </project>
4.nacos作为注册中心的使用
4.1 单机版的使用
主要照考自nacos官网wiki。
如何引入nacos作为注册中心
如果要在您的项目中使用 Nacos 来实现服务发现,使用 group ID 为 com.alibaba.cloud
和 artifact ID 为 spring-cloud-starter-alibaba-nacos-discovery
的 starter。
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
其中,具体的版本号在父pom中已指定。
创建一个Provider 应用
nacos-producer,以下步骤展示了如何将一个服务注册到 Nacos。
1.pom.xml的配置。一个完整的 pom.xml 配置如下所示:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <parent> 6 <artifactId>springcloud-alibaba</artifactId> 7 <groupId>cn.com.wjqhhuaxia</groupId> 8 <version>1.0-SNAPSHOT</version> 9 </parent> 10 <modelVersion>4.0.0</modelVersion> 11 12 <artifactId>nocas-provider</artifactId> 13 14 <dependencies> 15 <dependency> 16 <groupId>org.springframework.boot</groupId> 17 <artifactId>spring-boot-starter-web</artifactId> 18 </dependency> 19 20 <dependency> 21 <groupId>org.springframework.boot</groupId> 22 <artifactId>spring-boot-starter-actuator</artifactId> 23 </dependency> 24 25 <dependency> 26 <groupId>com.alibaba.cloud</groupId> 27 <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> 28 </dependency> 29 </dependencies> 30 31 <build> 32 <plugins> 33 <plugin> 34 <groupId>org.springframework.boot</groupId> 35 <artifactId>spring-boot-maven-plugin</artifactId> 36 </plugin> 37 </plugins> 38 </build> 39 40 </project>
2. application.properties 配置。
# 服务端口
server.port=8081
# 服务名称
spring.application.name=nacos-provider
# nacos注册中心地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 暴露所有端点
management.endpoints.web.exposure.include=*
3.启动 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; } } }
******再启动 Provider 应用之前 请先将 Nacos 服务启动。具体启动方式可参考 Nacos 官网。*******
这个时候你就可以在 Nacos的控制台上看到注册上来的服务信息了。
如下图所示即表明服务提供者已正常注册至nacos服务注册中心
创建一个 Consumer 应用
nacos-consumer
由于nacos集成了ribbon,所以引入nacos即也就拥有了客户端负载的能力。
consumer的pom.xml 和 application.properties 的配置同服务提供者provider工程一致。在此不作累述。
启动一个 Consumer应用的示例代码如下所示:
@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(){ //使用 LoadBalanceClient 和 RestTemolate 结合的方式来访问 ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-provider"); String url = String.format("http://%s:%s/echo/%s",serviceInstance.getHost(),serviceInstance.getPort(),appName); System.out.println("request url:"+url); return restTemplate.getForObject(url,String.class); } } //实例化 RestTemplate 实例 @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(NacosConsumerApp.class,args); } }
在启动 Consumer 应用之前请先将 Nacos 服务启动好。具体启动方式可参考 Nacos 官网。
启动consumer应用,当发现consumer能正常注册进入nacos控制台的服务列表,则表明consumer服务注册成功
这个例子中我们注入了一个 LoadBalancerClient 的实例,并且手动的实例化一个 RestTemplate,同时将 spring.application.name
的配置值 注入到应用中来, 目的是调用 Provider 提供的服务时,希望将当前配置的应用名给显示出来。
接下来进行服务间接口调用测试
4.2 linux环境nacos集群部署
官网集群部署说明:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
说明:
这里vip使用的是nginx,存储用的是msql。同时,jdk/nginx/mysql安装在这里不做介绍。
具体步骤如下:
1.下载nacos server安装包并上传至linux服务解压
安装包下载官方地址:https://github.com/alibaba/nacos/releases
2.初始化mysql数据库,数据库初始化文件:nacos-mysql.sql
3.修改/nacos/conf/application.properties文件,增加mysql相关配置
**** 注**** 最好先备份,再修改 例:cp application.properties application.properties.bakxxx
增加如下配置:
spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=root db.password=xxxx
4.启动单机版nacos,测试mysql配置是否正常
单机启动命令:sh startup.sh -m standalone
测试,登录nacos控制台后,在配置管理中添加test-mysql-config.properties配置,同时,mysql数据库中生成对应数据,则表示mysql配置OK,数据存储至mysql数据库中。
5.集群配置文件修改
配置文件路径:/nacos/conf/cluster.conf.example
设置集群的IP + 端口,示例:
ip:8848 ip:8849 ip:8850
6.修改nacos的启动脚本startup.sh使其支持指定端口启动:
【****】一定要先做startup.sh的备份,以防改错,例:cp startup.sh startup.sh.bk
修改项如下图所示(图片来至尚硅谷-阳哥的springcloud脑图):
7.nginx配置修改
注意事项:
1.如果是mysql1.8+版本请参考如下配置
添加mysql-connector-java-8.0.18.jar
到 /nacos/plugins/mysql/mysql-connector-java-8.0.18.jar
2.由于我是在阿里云服务器上搭建的集群环境,所以需要先确保对应的端口是开放的:先配置安全策略开放对应访问的端口,再打开防火墙
3.linux防火墙和nginx配置修改后,记得重启防火墙/nginx。
5.nacos注册中心原理
https://www.cnblogs.com/wuzhenzhao/p/13625491.html
参考:
https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery
https://www.lagou.com/lgeduarticle/126511.html