20.SpringCloudAlibaba Nacos(服务注册于配置中心)

Nacos:前四个字母分别是Naming和Configuration的前两个字母,最后的s是Service
是什么呢?
   一个更易于构建云原生的动态服务发现、配置管理和服务管理平台

Nacos就是注册中心+配置中心的结合
    等价于 Nacos=Eureka(服务注册中心)+Config(服务配置中心)+Bus(服务总线)

1.Nacos的下载安装

下载安装参考网上
安装成功后,登录:http://192.168.2.129:8848/nacos出现下面页面
默认登录账号和密码:nacos/nacos

2.Nacos服务端和客户端搭建

1.参考官网:https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html
步骤:
    1.在父项目中引入:
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <type>pom</type>
            <scope>import</scope>
          </dependency>
        </dependencies>
    
    2.创建两个服务提供端,代码都一样,只是端口分别为9001/9002
        2.1 pom文件中引入的特别除:
            1:引入nacos
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>
            2.引入web
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            3.引入监控
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
        2.2在application.yml中的配置
            server:
              port: 9001
            spring:
              application:
                name: nacos-person-provider
              #重点1:绑定nacos的地址
              cloud:
                nacos:
                  discovery:
                    server-addr: 192.168.2.129:8848
            #重点2:暴露所有端点
            management:
              endpoints:
                web:
                  exposure:
                    include: '*'
        2.3 控制层代码,提供生成uuid的方法
            @RestController
            public class PersonController {
                重点1:获取服务端口,因为有两个服务端,为后面演示的负载均衡做准备
                @Value("${server.port}")
                private int serverPort;
                @GetMapping("/provider/getUUid/{id}")
                public String getUUID(@PathVariable("id") int id){
                    return "alibaba服务提供端-->请求id:"+id+"  UUID:"+ IdUtil.simpleUUID()+" 服务端口:"+serverPort;
                }
            }
        2.4 启动类代码:
            @SpringBootApplication
            重点1:加上@EnableDiscoveryClient注解:让注册中心可以发现该服务,扫描到该服务
            @EnableDiscoveryClient
            public class AlibabaPersonProviderApplication9002 {
                public static void main(String[] args) {
                        SpringApplication.run(AlibabaPersonProviderApplication9002.class, args);
                    }
            }
    
    
    3.服务调用端代码:
        3.1 pom文件的内容:
            1:引入nacos
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>
            2.引入web
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            3.引入监控
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
        3.2 由下图知,spring-cloud-starter-alibaba-nacos-discovery包中包含有netflix的ribbon,所以肯定支持负载均衡和restTemplate远程请求

3.3 config配置类代码:
            @Configuration
            public class Myconfig {
                重点1:容器中加入RestTemplate组件,并使用@LoadBalanced注解,使进行轮训的负载均衡
                @Bean
                @LoadBalanced
                public RestTemplate getRestTemplate(){
                    return new RestTemplate();
                }
            }
        
        3.4applicaiton.yml配置文件代码:
            server:
              port: 81
            spring:
              application:
                name: nacos-person-consumer
              #重点1:绑定nacos的地址
              cloud:
                nacos:
                  discovery:
                    server-addr: 192.168.2.129:8848
            重点2:自定义个key,值是服务注册中心中服务提供端的名称,即服务提供端的spring.appliaciton.name
            server-url:
              nacos-user-service: http://nacos-person-provider
        3.4 控制层代码
            @RestController
            public class PersonConsumerController {
                重点1:获取RestTemplate对象
                @Resource
                private RestTemplate restTemplate;
                重点2:获取远程服务的nacos地址,从配置文件中获取,做到配置和代码分离
                @Value("${server-url.nacos-user-service}")
                private  String uri;
                @GetMapping("/consumer/getUUID/{id}")
                public String getUUId(@PathVariable("id") int id){
                    return restTemplate.getForObject(uri+"/provider/getUUid/"+id,String.class);
                }
            }
            
测试:当浏览器输入客户端请求:http://localhost:81/consumer/getUUID/5时
页面轮询出现:发现端口轮询,即两个服务提供端轮询提供服务
    alibaba服务提供端-->请求id:5 UUID:5440c99cb2624e37979c5fe2700bee70 服务端口:9001
    alibaba服务提供端-->请求id:5 UUID:d2151e99b0154fd1ac469c72a961f773 服务端口:9002
    ..

 

posted @ 2022-05-29 17:50  努力的达子  阅读(56)  评论(0编辑  收藏  举报