微服务 2:服务注册发现中心(Nacos)(文末有项目连接)

2021-04-14  本文已影响0人  _River_
文章知识来源主要来源于:赵俊夫先生的博客  以下为原文链接
https://blog.csdn.net/u011177064/category_9572944.html
1: Nacos介绍
 Nacos是阿里巴巴最新开源的项目,核心定位是“一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台”,项目地址:https://nacos.io/zh-cn/

 Nacos核心提供两个功能:服务注册与发现,动态配置管理。
 1:服务注册与发现
     Nacos提供基于DNS和基于RPC的服务发现,即能被用来支持https/http的服务注册与发现,也支持RPC如dubbo的服务注册与发现
     现在阿里官方也推荐使用Nacos来代替Zookeeper。
     
     与Dubbo使用的zookeeper相比而言,还是有挺大的差别的 ,zookeeper是一种分布式的协调服务,
     它天生是作为分布式数据一致性场景下的解决方案,它牺牲了可用性来保证一致性(master选举期间服务会对外停止)
     而Nacos是一种去中心化的架构。
           
 2:动态配置服务
    动态修改配置并实时生效对于服务端的同学而已并不陌生,这种服务能够让我们的服务拥有更多的灵活性,
    不需要重启服务即可做到配置实时生效,非常适合于“配置优先”的服务开发。

  注意:SpringCloud默认的注册中心 Eurka  已经停止更新
2: Nacos的安装
   见以下链接:
   Docker安装Nacos
  https://www.jianshu.com/p/d2c81d647323
3:注册发现流程
1:创建 服务1 consumer 
2:创建 服务2 provider  

3:nacos 作为 服务注册发现中心

流程:
    1:consumer  注册到 nacos
    2:provider   注册到  nacos
    3:http 调用 consumer  
        在consumer的逻辑中通过loadBalancerClient 获取nacos 里的provider的信息
        通过provider的信息拼装成url
        请求该url
    4:http 返回结果为调用provider的结果
3:Pom文件 (provider 与 consumer)
 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

<properties>

        <spring.boot.version>2.1.0.RELEASE</spring.boot.version>
        <spring.cloud.version>Greenwich.SR2</spring.cloud.version>
        <spring.cloud.alibaba.version>2.1.0.RELEASE</spring.cloud.alibaba.version>

        <java.version>1.8</java.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
<!--                spring-boot-->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
<!--            spring-cloud-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
<!--            spring-cloud-alibaba-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring.cloud.alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>


    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--        引入lombok 使用@Data注解  使用@Slf4j注解-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--        使用alibaba的 json转换-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <!--            排除junit5单元测试的maven包 -->
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
4:yml配置文件
server:
  port: server-port
spring:
  application:
    name: nacos-name
  cloud:
    nacos:
      discovery:
        server-addr: nacos-host:nacos-port

management:
  endpoints:
    web:
      exposure:
        include: "*"
5:Consumer主要逻辑
@RestController
@Slf4j
public class NacosConsumerApi {
    @Value("${spring.application.name}")
    private String appName;

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    private RestTemplate restTemplate = new RestTemplate();

    @GetMapping(value = "/nacos/{string}")
    public String nacos(@PathVariable String string) {

        //使用LoadBalanceClient的方式来获取 nacos-provider的服务信息
        ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-provider");
        log.info( "打印serviceInstance信息:{}",JSONObject.toJSONString(serviceInstance));

        // 对将要请求的url进行组装
        String url = String.format("http://%s:%s/nacos/%s", serviceInstance.getHost(), serviceInstance.getPort(),
                appName);

        http://192.168.137.1:9991/nacos/nacos-consumer
        log.info("你好,我是请求的url request url:{}" , url);

        //注意这里面 restTemplate.getForObject 已经进行了一次请求
        log.info( "打印返回信息:{}",JSONObject.toJSONString(restTemplate.getForObject(url, String.class)));

        return restTemplate.getForObject(url, String.class);
    }
    
}
6:Provider主要逻辑
@RestController
@Slf4j
public class NacosProviderApi {

    @GetMapping(value = "/nacos/{string}")
    public String nacos(@PathVariable String string) {
        log.info("请求到服务发现端 /nacos/{string} 的接口");
        return "Hello Nacos Discovery " + string;
    }
}
7:Nacos界面与测试效果



项目连接

请配合项目代码食用效果更佳:
项目地址:
https://github.com/hesuijin/spring-cloud-alibaba-project
Git下载地址:
https://github.com.cnpmjs.org/hesuijin/spring-cloud-alibaba-project.git

在service-provider-demo  模块下
在service-consumer-demo 模块下
上一篇 下一篇

猜你喜欢

热点阅读