Spring Cloud Alibaba Nacos之服务注册中心

一、简介

在Spring Cloud系列课程中,我们已经实现了利用Eureka、Consul、Zookeeper作为我们的服务注册中心,在Spring Cloud Alibaba中,提供了一个更加简洁方便的服务注册中心组件 - Nacos。

  • 为什么叫Nacos?

前四个字母分别为Naming和Configuration的前两个字母,最后的s为service。

  • Nacos是什么?

一个更易于构建原生应用的动态服务发现、配置管理和服务管理平台(Dynamic Naming and Configuration Service),Nacos就是注册中心  + 配置中心的组合。等价于:Nacos = Eureka + Config + Bus

  • Nacos能干嘛?
  1. 替代Eureka做服务注册中心;
  2. 替代Config做服务配置中心;

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理

Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

  • 去哪里下载Nacos以及文档地址?

Nacos各个版本下载地址

Nacos GitHub地址

Nacos官网

Nacos文档地址

二、Nacos的关键特性

  • 服务发现和服务健康监测

    Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDKOpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。

    Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。

  • 动态配置服务

    动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。

    动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。

    配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。

    Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。

  • 动态 DNS 服务

    动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。

    Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表.

  • 服务及其元数据管理

    Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

Nacos 全景图如下图:

nacos_landscape.png

如 Nacos 全景图所示,Nacos 无缝支持一些主流的开源生态,例如

使用 Nacos 简化服务发现、配置管理、服务治理及管理的解决方案,让微服务的发现、管理、共享、组合更加容易。

关于如何在这些生态中使用 Nacos,请参考以下文档:

Nacos与Spring Cloud一起使用

Nacos与Kubernetes一起使用

Nacos与Dubbo一起使用

Nacos与gRPC一起使用

Nacos与Istio一起使用

 三、安装并运行Nacos

预备环境准备:

Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:

  1. 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
  2. 64 bit JDK 1.8+;下载 & 配置
  3. Maven 3.2.x+;下载 & 配置

【a】先从官网下载Nacos,这里使用nacos-server-1.2.0版本的为例,如下图:

【b】解压缩安装包,直接运行bin目录下的startup.cmd

启动命令:

cmd startup.cmd

或者双击startup.cmd运行文件。

 [【c】命令运行成功后直接访问:http://localhost:8848/nacos;默认的账号密码都是nacos。

如果成功进入Nacos控制台,说明Nacos安装并且运行成功。

【d】关闭服务器(Windows系统)

cmd shutdown.cmd

或者双击shutdown.cmd运行文件。

四、Nacos之服务提供者注册

前面我们已经搭建好了Nacos服务端,大家是不是迫不及待想玩玩我们的服务到底怎么注册进Nacos?

接下来,我们就以一个示例详细说明整个注册的步骤,通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-discovery 实现服务的注册与发现。

这里我们新建一个module【springcloudalibaba-provider-payment9001】

【a】父工程pom.xml:由于是spingcloud alibaba的第一个子模块,需要在父工程引入springcloud alibaba的总依赖

<!--spring cloud alibaba 2.1.0.RELEASE-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

【b】本工程pom.xml:添加spring-cloud-starter-alibaba-nacos-discovery服务注册发现相关依赖

<?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">
    <parent>
        <artifactId>springcloud2020</artifactId>
        <groupId>com.wsh.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloudalibaba-provider-payment9001</artifactId>
    <dependencies>
        <!--SpringCloud ailibaba nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- SpringBoot整合Web组件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <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>
        </dependency>
    </dependencies>

</project>

【c】application.yml:指定nacos服务端地址,服务名称,对外保留监控端点等

spring:
  application:
    name: springcloudalibaba-provider-payment
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848  #指定Nacos服务端地址
management:
  endpoints:
    web:
      exposure:
        include: '*'  #暴露的监控端点
server:
  port: 9001 #服务端口号

【d】主启动类

package com.wsh.springcloud.alibaba;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@SpringBootApplication
public class SpringCloudAlibabaPaymentServiceApplication9001 {
    public static void main(String[] args) {
        SpringApplication.run(SpringCloudAlibabaPaymentServiceApplication9001.class, args);
    }
}

【e】业务类

package com.wsh.springcloud.alibaba.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PaymentController {
    @Value("${server.port}")
    private String serverPort;

    @GetMapping(value = "/payment/nacos/{name}")
    public String getPayment(@PathVariable("name") String name) {
        return "[springcloudalibaba-provider-payment]注册到Nacos, 端口号: " + serverPort + ", this name is " + name;
    }

}

【f】测试

启动项目,进入nacos控制台:http://localhost:8848/nacos/,如果在服务管理 -> 服务列表中可以看到我们自己的服务【springcloudalibaba-provider-payment】

说明我们成功完成了服务注册进Nacos。Nacos控制台提供了很多关于微服务实例的信息,如下图:

微服务详情信息:

微服务示例代码:用来获取某个微服务的所有实例信息等

总体来说,Nacos提供的可视化控制台比Eureka的强大了很多,至少nacos提供了强制剔除实例的操作按钮,而Eureka如果需要强制剔除实例的话,还需要手动发送post请求去剔除,较麻烦。

接下来我们浏览器访问:http://localhost:9001/payment/nacos/weishihuai

以上就是关于如何将服务注册进Nacos的详细步骤,总的来说,还是比较简单的。

【g】补充说明

为了后面演示服务消费者负载均衡调用服务提供者的功能,而我们现在只有一个服务提供者,需要提供多一个,这里我们新建多一个module【springcloudalibaba-provider-payment9002】,代码跟9001除了端口号不一样,其他全部一样,这里就不过多阐述,相信大家都可以完成的:

创建完启动项目9002,访问nacos控制台,可以看到实例个数已经变为2了,说明成功搭建。

五、Nacos之服务消费者注册和负载均衡

新建一个module【springcloudalibaba-consumer-nacos-order83】作为服务消费者,通过远程调用服务提供者【springcloudalibaba-provider-payment】的接口。

【a】pom.xml依赖:加入nacos相关依赖spring-cloud-starter-alibaba-nacos-discovery

<?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">
    <parent>
        <artifactId>springcloud2020</artifactId>
        <groupId>com.wsh.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloudalibaba-consumer-nacos-order83</artifactId>
    <dependencies>
        <!--SpringCloud ailibaba nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- SpringBoot整合Web组件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <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>
        </dependency>
    </dependencies>

</project>

【b】application.yml

server:
  port: 83 #服务端口号
spring:
  application:
    name: springcloudalibaba-consumer-nacos-order
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848  #指定nacos服务端地址

#消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url:
  provider-payment: http://springcloudalibaba-provider-payment   #名字对应到服务提供者application.name

【c】主启动类

package com.wsh.springcloud.alibaba;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@SpringBootApplication
public class OrderNacosServiceApplication83 {
    public static void main(String[] args) {
        SpringApplication.run(OrderNacosServiceApplication83.class, args);
    }
}

【d】负载均衡配置类:跟以前Spring Cloud的负载均衡配置一模一样。

package com.wsh.springcloud.alibaba.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @Description 负载均衡配置
 * @Date 2020/8/30 10:30
 * @Author weishihuai
 * 说明: 跟前面讲解的Spring Cloud负载均衡配置一模一样
 */
@Configuration
public class ApplicationContextConfig {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

【e】测试负载均衡业务方法

package com.wsh.springcloud.alibaba.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

/**
 * @Description 服务负载均衡调用测试
 * @Date 2020/8/30 10:30
 * @Author weishihuai
 * 说明:
 */
@RestController
public class OrderNacosController {
    /**
     * 注入restTemplate
     */
    @Resource
    private RestTemplate restTemplate;

    /**
     * 获取到服务提供者URL
     */
    @Value("${service-url.provider-payment}")
    private String paymentProviderURL;

    @GetMapping(value = "/consumer/payment/nacos/{name}")
    public String paymentInfo(@PathVariable("name") String name) {
        return restTemplate.getForObject(paymentProviderURL + "/payment/nacos/" + name, String.class);
    }

}

【f】测试

启动服务消费者order83,查看nacos服务注册列表:

可见,服务消费者order83也成功注册进nacos,接下来我们测试负载均衡调用,其实Nacos默认集成了Ribbon负载均衡功能,可以看到我们在pom.xml中并没有单独引入Ribbon的依赖,原因是:spring-cloud-starter-alibaba-nacos-discovery里面已经集成了Ribbon,如下图所示:

然后我们浏览器多次访问:http://localhost:83/consumer/payment/nacos/weixiaohuai

可以看到,跟Spring Cloud一样,服务消费者默认采用的轮训策略去调用服务提供者的接口,说明我们成功利用nacos实现了服务的负载均衡调用。

六、总结

本文通过示例详细说明了如何搭建Nacos服务器并且将我们的微服务注册进Nacos以及实现了客户端服务的负载均衡调用,个人感觉比起Eureka来说配置方面还是比较简洁的。以上相关项目的代码我已经放在Gitee上,有需要的小伙伴可以去拉取进行学习:https://gitee.com/weixiaohuai/springcloud_Hoxton,由于笔者水平有限,如有不对之处,还请小伙伴们指正,相互学习,一起进步。

参考资料:

https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-cloud-example/nacos-spring-cloud-config-example

https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html

https://spring.io/projects/spring-cloud-alibaba#learn

下面是笔者总结的关于Spring Cloud Alibaba教程系列文章目录,有需要的小伙伴可以前往学习:

1. Spring Cloud Alibaba入门简介

2. Spring Cloud Alibaba Nacos之服务注册中心

3. Spring Cloud Alibaba Nacos之服务配置中心

4. Spring Cloud Alibaba Nacos集群和持久化配置

5. Spring Cloud Alibaba Sentinel之入门篇

6. Spring Cloud Alibaba Sentinel之流控规则篇

7. Spring Cloud Alibaba Sentinel之服务降级篇

8. Spring Cloud Alibaba Sentinel之热点参数限流篇

9. Spring Cloud Alibaba @SentinelResource配置详解

10. Spring Cloud Alibaba Sentinel之服务熔断篇

11. Spring Cloud Alibaba Sentinel之持久化篇

12. Spring Cloud Alibaba Seata处理分布式事务及案例实战

13. Spring Cloud Alibaba Seata工作原理

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值