【springcloud alibaba】注册中心之nacos

1.为什么需要注册中心

  1.1 没有注册中心会怎么样

  1.2 注册中心提供什么功能以及解决什么问题

2.常用的微服务注册中心对比

3.案例项目父工程

4.nacos作为注册中心的使用

  4.1 单机版的使用

  4.2 linux环境nacos集群部署

5.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>
View Code

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>
View Code

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

  https://blog.csdn.net/xxscj/article/details/90901505

  https://www.cnblogs.com/dw3306/p/12961353.html

原文地址:https://www.cnblogs.com/wjqhuaxia/p/14131359.html