• 【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

  • 相关阅读:
    python递归函数
    python全局替换文件内容脚本第1版
    python的if判断补充
    python装饰器
    python函数作用域
    python函数基础
    python文件操作
    ASCII、Unicode和UTF-8编码的区别
    python基础(二)----数据类型
    python基础第一章
  • 原文地址:https://www.cnblogs.com/wjqhuaxia/p/14131359.html
Copyright © 2020-2023  润新知