本文适合有 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 IDEASpring 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。修改 Nacosusername 的值,不需要重启微服务,重新请求链接 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. 把python文件打包成可执行文件(win10实验成功)

    总是有人来找我帮看下工单状态,又懒得写页面展示出来,干脆打包成exe文件好啦 打包很简单,难点在于安装pyinstaller这个依赖包,主要是网络问题~ 我也是参考别人的博文,别人的文章写得很详细,我 ...

  2. shell-的变量-全局变量

    shell变量基础及深入   1. 变量类型 变量可分为两类:环境变量(全局变量)和局部变量. 环境变量也可称为全局变量,可以在创建他们的shell及其派生出来的任意子进程shell中使用.局部变量只 ...

  3. Netty之网络编程数据编码

    一.概况 我们在进行网络编程中会把各种数据转换为byte数据以便能在网络上传输,最常见的网络字节序--Little-Endian和Big-Endian,也让好多初进网络编程的新手摸不着头脑,还有按位或 ...

  4. 开始接触flex

    flex框架使用的是.mxml后缀的文件,可以在Eclipse导入flex开发的插件.代码写完之后需要进行编译成为.swf文件成功之后才可以正常运行.现在刚开始接触金融的项目,需求什么的还有很多不是理 ...

  5. JDBC的学习(一)

    JDBC的学习(一) 概念 所谓英文简写的意思是:Java DataBase Connectivity ,即 Java数据库的连接,用Java语言来操作数据库 本质 简单的来说,就是写这个JDBC的公 ...

  6. Verilog基础入门——简单的语句块编写(一)

    [题干] [代码] module top_module ( input in, output out ); assign out = ~in; endmodule 简单的实现一个非门

  7. HCIA——应用层常用协议

    DNS协议 1.什么是DNS协议呢? DNS协议简单来说就是为IP取一个别名的系统(叫域名如www.baidu.com),最终目的是便于我们记忆. 一个域名可能有多个IP,同样一个IP可能也会有多个域 ...

  8. 在VC6.0下运行C语言程序,以及编程入门必备的常识类小知识!

    今天给大家分享在VC6.0环境下编写C语言程序的基本步骤,为初学者打开学习C语言的第一道门.具体步骤如下(如果需要软件资源,可以留言): 1)新建工作区 依次点击 文件--新建--工作区 或是Ctrl ...

  9. git merge 与 git rebase的区别?

    一,git merge 与 git rebase的区别 1,git merge 例如: master分支合并dev分支,git将两个分支dev和master上的所有commit , 按照提交时间的先后 ...

  10. Centos6.X 手动升级gcc

    操作环境 CentOS6.5 64bit,gcc原版本为4.4.7,不能支持C++11的特性,所以需要升级 [root@zengxj ~]# wget http://ftp.gnu.org/gnu/g ...