zoukankan      html  css  js  c++  java
  • Spring Cloud Alibaba 使用Nacos作为服务注册中心

    为什么需要注册中心?

    在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址,进行调用;服务管理,核心是有个服务注册表,心跳机制动态维护 ;

    服务注册

    创建普通SpringBoot工程(spring-cloud-alibaba-service-user)该工程当前用于使用Nacos进行服务注册。

    pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.gitee</groupId>
        <artifactId>spring-cloud-alibaba-service-user</artifactId>
        <version>0.0.1</version>
        <dependencyManagement>
            <dependencies>
                <!-- 依赖管理父工程 -->
                <dependency>
                    <groupId>com.gitee</groupId>
                    <artifactId>spring-cloud-alibaba-version-parent</artifactId>
                    <version>${project.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
        <dependencies>
            <!-- 公共模块 -->
            <dependency>
                <groupId>com.gitee</groupId>
                <artifactId>spring-cloud-alibaba-common</artifactId>
                <version>${project.version}</version>
            </dependency>
            <!-- web服务 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-tomcat</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <!-- undertow服务器 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-undertow</artifactId>
            </dependency>
            <!-- 参数校验 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-validation</artifactId>
            </dependency>
            <!-- nacos 服务治理 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>
            <!-- nacos 配置中心 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            </dependency>
            <!-- openfeign 服务发现调用 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
        </dependencies>
    </project>
    

    application.yaml

    server:
      port: 8080
    spring:
      application:
        name: service-user
      cloud:
        nacos:
          discovery:
            #注册中心地址
            server-addr: localhost:8848
            #服务元数据
            metadata:
              version: 0.0.1
              appname: ${spring.application.name}
    

    UserServiceApplication.java

    /**
     * 用户中心服务启动类
     *
     * @author wentao.wu
     */
    @EnableDiscoveryClient//服务注册
    @SpringBootApplication
    public class UserServiceApplication {
        public static void main(String[] args) {
            SpringApplication.run(UserServiceApplication.class, args);
        }
    }
    

    HelloWorldController.java

    /**
     * HelloWorld Web
     *
     * @author wentao.wu
     */
    @RequestMapping(value = "/hello/")
    @RestController
    public class HelloWorldController {
        @GetMapping("/say/{name}")
        public Response<String> say(@PathVariable("name") String name) {
            Response<String> response = new Response<>();
            response.setCode("1");
            response.setMsg("你好啊," + name + "!");
            return response;
        }
    }
    

    以上内容是整个工程当前的内容,直接运行访问:http://localhost:8080/hello/say/nacos,后者输出:

    {
        "code": "1",
        "msg": "你好啊,nacos!",
        "errorCode": null,
        "errorMsg": null,
        "result": null
    }
    

    看到以上返回内容代表整个服务完全启动成功。进入nacos管理界面:http://localhost:8848/nacos 默认登录账号与密码为 nacos/nacos

    进入服务管理菜单->服务列表就能够看到我们注册进去的服务。

    点击详情即可查看服务元数据:

    image-20211028095526214

    从Nacos之中服务列表能够看到我们所注册的服务意味这服务已经注册到Nacos Server端。

    多环境服务隔离

    用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

    在资源不够的情况下,开发环境(dev),综合测试环境(sit),业务测试环境(uat)通常会公用一套Nacos Server,使用Namespace 来区分环境,然后再通过dataID来指定每个服务的配置文件,这样就可以每个环境的服务注册发现不会相互干扰,并且也不会用到其他环境的配置文件。

    创建命名空间

    从Nacos菜单中命名空间点击新建命名空间,输入空间名称与描述,命名空间ID可填可不填,不填则会自动生成一串UUID的字符。

    记录自动生成的命名空间ID:7e3699fa-09eb-4d47-8967-60f6c98da94a

    工程使用对应的命名空间

    application.yaml

    server:
      port: 8080
    spring:
      application:
        name: service-user
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848
            metadata:
              version: 0.0.1
              appname: ${spring.application.name}
            #指定命名空间 对应dev环境
            namespace: 7e3699fa-09eb-4d47-8967-60f6c98da94a
            #指定分组 案例组
            group: EXAMPLE-GROUP
            #指定集群环境 华南
            cluster-name: HuaNan
    

    这里添加了3个配置。

    Namespace:使用dev环境的命名空间id指定该服务部署在dev环境下与其他命名空间服务进行隔离。

    Group: 标识该服务属于哪个项目组。

    Cluster-name:标识该服务部署在华南地区。

    Nacos Server最终由namespace->group->ServiceID->Cluster-name获取到对应的服务实例列表。

    配置好之后运行UserServiceApplication.java对服务进行重启,重启之后服务将重新注册到Nacos中并且在Web界面服务列表中Dev命名空间进行显示。

    注意事项

    Namespace与Group配置后只有Namespace与Group相同的才能够算作一套系统,只有同一套系统才能够内部进行快速访问,如使用feign进行远程调用时,GROUP=金融系统与GROUP=电商系统两个不同的GROUP在其中是不能够直接通过Feign服务发现进行访问的,对应的业务服务只会发现对应Namespace与Group中的服务。

    源码代码存放地址

    gitee: https://gitee.com/SimpleWu/spring-cloud-alibaba-example.git
    cnblogs: https://www.cnblogs.com/SimpleWu
    持续更新目录:https://www.cnblogs.com/SimpleWu/p/15476427.html

    学习是永无止境的。
  • 相关阅读:
    Codeforces 1065C Make It Equal
    Codeforces 1065B Vasya and Isolated Vertices
    Codeforces 1065A Vasya and Chocolate
    Luogu P2467 [SDOI2010]地精部落
    Codeforces 1042C Array Product
    Codeforces 1041C Coffee Break
    JMeter安装和环境变量搭建
    Jenkins
    Jenkins介绍
    Docker
  • 原文地址:https://www.cnblogs.com/SimpleWu/p/15476459.html
Copyright © 2011-2022 走看看