本文适合有 Java 基础知识的人群

本文作者:HelloGitHub-秦人

HelloGitHub 推出的《讲解开源项目》系列,今天给大家带来一款开源 Java 版可以实现动态服务发现,配置和服务管理平台——Nacos,它是阿里巴巴团队开源符合国人的一切使用习惯,并且中文文档丰富,开源社区也特别活跃。

项目源码地址:https://github.com/alibaba/nacos

一、项目介绍

在选择使用一个工具之前,我们先大概了解一下它的同类型产品,这样更能看出它的价值。

三大注册中心

名称 配置中心 注册中心 依赖 访问协议 版本迭代 集成支持 上手程度
Eureka 不支持 支持 依赖ZooKeeper HTTP 无版本升级 SpringCloud集成 容易,英文界面,不符合国人习惯
Consul 支持 支持 不依赖其他组件 HTTP/DNS 版本迭代中 SpringCloud、K8S 复杂,英文界面,不符合国人习惯
Nacos 支持 支持 不依赖其他组件 HTTP/动态DNS/UDP 版本迭代中 Dubbo、SpringCloud、K8S 极易,中文文档和社区,符合国人习惯

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

主要特性:

  • 服务发现:支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的 Agent TODO 注册 Service 后,服务消费者可以使用 DNS TODO 或 HTTP&API 查找和发现服务。
  • 服务健康监测:提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。
  • 动态配置服务:动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
  • 动态 DNS 服务:动态 DNS 服务支持权重路由,使用者更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。
  • 服务及其元数据管理:Nacos 能让使用者从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

Nacos 生态图

二、SpringBoot 实战

Nacos 主要的功能有配置中心和注册中心。

  • 配置中心:通过在 Nacos 上配置用户名,在不重启微服务的情况下实现动态获取配置信息功能。
  • 注册中心:创建两个微服务:服务提供者和服务消费者,实现微服务间调用。消费者要调用提供者的接口,只需要声明提供者的微服务名称和接口的请求地址,Nacos 就可准确的找到到对应的接口。

2.1 运行 Nacos

下载地址:https://github.com/alibaba/nacos/releases

unzip nacos-server-$version.zip  #解压
cd nacos/bin
startup.cmd -m standalone #单机模式

访问首页

Nacos 的访问地址:http://localhost:8848/nacos/

默认账号密码:nacos nacos

页面截图如下:

2.2 配置中心

创建微服务项目

创建 SpringBoot 项目主要有三种方式:通过网站创建,IntelliJ IDEA 的 Spring Initializr 工具创建,Maven 创建项目形式创建。

项目的pom 文件内容如下:

    <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <!--nacos-config的Spring cloud依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.9.0.RELEASE</version>
</dependency>

bootstrap.yml 配置

spring:
application:
name: nacos-config
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
prefix: nacos-config
profiles:
active: dev

Nacos 配置

Nacos 上创建配置文件名称格式:${prefix}-${spring.profile.active}.${file-extension},如上一步bootstrap.yml的配置可知,我要创建的配置名为:nacos-config-dev.yaml,内容如下:

创建 Controller

动态获取用户名称的功能为例:

创建一个对外接口 /username 代码如下:

@RestController
@RefreshScope
public class ConfigController { @Value("${username:wangzg}")
private String username; @RequestMapping("/username")
public String userNameInfo() {
return username;
}
}

注意:Controller 上要添加 @RefreshScope注解 它实现了配置的热加载。

验证结果

本地运行项目,可以看到项目的启动时,端口已变为我们在 Nacos 上配置的端口8090。

在浏览器访问链接:http://localhost:8090/username,返回 testuser。修改 Nacos 上 username 的值,不需要重启微服务,重新请求链接 username 的值会动态变。可见 Nacos 作为配置中心实现了热加载功能。

2.3 注册中心

  1. 创建服务提供者

创建微服务可参上面配置中心的创建方式,创建对外接口 /sayHello 代码如下:

@RestController
public class ProviderController { @GetMapping("/sayHello")
public String sayHello(@RequestParam(value = "name",defaultValue = "helloWord")String sayHello){ return "tom say: " + sayHello;
}
}

启动服务,访问地址:http://localhost:8099/sayHello,可输出:

tom say: helloWord,表示微服务已创建成功。

  1. 创建服务消费者

这里采用 FeignClient 的方式实现跨服务间调用(有兴趣的同学也可以研究一下RestTemplate的方式)。

pom 文件

在 nacos-consumer 的 pom 文件要添加 Feigin-Client 的 maven 依赖。

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

添加注解

在微服务启动类 *Application.java 添加注解 @EnableFeignClients。

创建 FeignClient

@FeignClient("nacos-provider")
public interface ProviderClient { @GetMapping("/sayHello")
String sayHello(@RequestParam(value = "name", defaultValue = "wangzg", required = false) String name);
}

说明:FeignClient 注解传入的 name,指定 FeignClient 的名称,如果项目使用了 Ribbon,name 属性会作为微服务的名称,用于服务发现。

创建 ConsumerController

@RestController
public class ConsumerController { @Autowired
ProviderClient providerClient; @GetMapping("/hi-feign")
public String hiFeign(){
return providerClient.sayHello("feign");
}
}

重启工程,在浏览器上访问http://localhost:8090/hi-feign,可以在浏览器上展示正确的响应,这时 nacos-consumer 调用 nacos-provider 服务成功。

下面一张请求流转的时序图,这样理解清晰一些。

项目地址:https://github.com/hellowHuaairen/wangzgSpringBootTest

三、最后

微服务有四大特点:

  • 小(微服务粒度小)
  • 独(独立部署运行和扩展)
  • 轻(系统简洁轻量化)
  • 松(高内聚低耦合)

要完成一个复杂系统往往需要很多微服务单元,而衔接每个微服务,完成微服务的统一管理就非常有必要,所以集成服务管理中心和配置中心的产品就的就应运而生,而 Nacos 是其中的佼佼者!

教程至此,你应该也能对 Nacos 有一些了解!光看不练假把式,最快的学习方式莫过于模仿,再通过举一反三才能融会贯通。每一种新工具都是对老工具的革新,有兴趣的小伙伴可以参考我上面的案例,在实践中会发现更多乐趣!

四、参考资料

搞微服务用阿里开源的 Nacos 真香啊!的更多相关文章

  1. SpringCloud微服务:阿里开源组件Nacos,服务和配置管理

    源码地址:GitHub·点这里||GitEE·点这里 一.阿里微服务简介 1.基础描述 Alibaba-Cloud致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用微服务的必需组件,方便开 ...

  2. 微服务架构 | 3.2 Alibaba Nacos 注册中心

    目录 前言 1. Nacos 基础知识 1.1 Nacos 命名方式 1.2 Nasoc 是什么 1.3 Nacos 的 4 个关键特性 1.4 Nacos 生态图 1.5 Nacos 架构图 1.6 ...

  3. 微服务架构 | 2.2 Alibaba Nacos 的统一配置管理

    目录 前言 1. Nacos 配置中心基础知识 1.1 Nacos 在配置中心中的功能 1.2 Nacos 配置管理 Data ID 的构成 1.3 Nacos 配置的回滚机制 1.4 Nacos 配 ...

  4. 微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍

    微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍 一.为什么会有 API Gateway 网关 随着微服务架构的流行,很多公司把原有的单 ...

  5. SpringCloudAlibaba 微服务讲解(三)Nacos Discovery-服务治理

    3.1 服务治理 先来思考一个问题,通过上一章的操作,我们已经实现微服务之间的调用,但是我们把服务提供者的网络地址(ip,端口)等硬编码到了代码中,这种做法存在许多问题: 一旦服务提供者地址变化,就需 ...

  6. 前端云原生,以 Kubernetes 为基础设施的高可用 SSR(Vue.js) 渲染微服务初探(开源 Demo)

    背景 笔者在逛掘金的时候,有幸看到掘友狼族小狈开源的 genesis - 一个可以支持 SSR 和 CSR 渲染的微服务解决方案.总体来说思想不错,但是基于 Kubernetes 云原生部署方面一直没 ...

  7. 使用微服务Blog.Core开源框架的一些坑

    1.使用SqlSuger组件时同一API无法自动切库 1.1 在生成Model时在类上加上特性 1.2 一个接口如果使用了多个数据库实例,会出现库找不到,需要使用ChangeDataBase切库 2. ...

  8. 微服务开源生态报告 No.4

    「微服务开源生态报告」,汇集各个开源项目近期的社区动态,帮助开发者们更高效的了解到各开源项目的最新进展. 社区动态包括,但不限于:版本发布.人员动态.项目动态和规划.培训和活动. 非常欢迎国内其他微服 ...

  9. 微服务开源生态报告 No.10

    「微服务开源生态报告」,汇集各个开源项目近期的社区动态,帮助开发者们更高效的了解到各开源项目的最新进展. 社区动态包括,但不限于:版本发布.人员动态.项目动态和规划.培训和活动. 非常欢迎国内其他微服 ...

随机推荐

  1. Java安全之Commons Collections1分析(二)

    Java安全之Commons Collections1分析(二) 0x00 前言 续上篇文,继续调试cc链.在上篇文章调试的cc链其实并不是一个完整的链.只是使用了几个方法的的互相调用弹出一个计算器. ...

  2. WSL2 bug

    错误现象 Stdout: Stderr: 2020/05/27 20:01:37 resolving /mnt/host/c/Program Files/Docker/Docker/resources ...

  3. Redis 客户端 Jedis、lettuce 和 Redisson 对比

    Redis 支持多种语言的客户端,下面列举了部分 Redis 支持的客户端语言,大家可以通过官网查看 Redis 支持的客户端详情. C语言 C++ C# Java Python Node.js PH ...

  4. (数据科学学习手札97)掌握pandas中的transform

    本文示例文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 开门见山,在pandas中,transform是 ...

  5. 多测师讲解接口自动化测试 _requests_高级讲师肖sir

    rep=requests.post 错误方法: 1.在代理中---把高级中----代理-----去除勾选,调用失败

  6. 多测师讲解自动化测试 _RF分配id_高级讲师肖sir

    1.Assign Id To Element.

  7. ES异常处理-NoNodeAvailableException

    1.问题描述 ES client客户端能创建,但是在用客户端操作时报:NoNodeAvailableException[None of the configured nodes are availab ...

  8. Shell Scripting 笔记

    Shell Scripting Tutorial Variables in the Bourne shell do not have to be declared, as they do in lan ...

  9. go读取键盘输入两种方式

    一种scanf var x intfmt.Println("input a int number")fmt.Scan(&x)fmt.Printf("读取到内容:% ...

  10. centos8平台上php7.4的生产环境配置

    一,php错误与日志的配置 1,创建php的日志保存目录: [root@yjweb ~]# mkdir -p /data/logs/phplogs [root@yjweb ~]# chmod 777 ...