nacos enablediscoveryclient_Spring Cloud(五):注册中心nacos篇

点击蓝字关注我们

cadf5be63d43d319acc677c17041079d.gif cadf5be63d43d319acc677c17041079d.gif 大家好,我是杰哥,转眼间,我们的Spring Cloud专辑已到了第五次分享,而我们的注册中心篇章已经分别完成了Eureka、zookeeper篇,今天正式进入 nacos篇 的学习 nacos作为注册中心和配置中心,这两年的热度还是挺高的。尤其是Eureka官方已经宣布Eureka2.0将会停止维护,naocs则变得更有优势。 它的版本更迭相对来说也比较快,按照目前的势头,相信会渐渐成长为Spring Cloud中配置中心和注册中心的独一无二的注册中心选择 本次文章只涉及nacos作为注册中心的部分功能,关于配置中心,则是我们注册中心篇结束之后的另一个篇章,敬请期待哦~

一 入门

初识nacos

01.什么是nacos

先来看看它的名字 Nacos,Na、co字母分别为 Naming 和 Configuration 的前两个字母,s 为Service 这个是官网上关于 Nacos服务的分级存储模型 0ff890123718b1d0880d723b0c60e84f.png 其实,分布式服务都基本如此。比如我们说,一个订单服务,可以分为不同环境,如开发、测试、生产环境,每个环境则是由一个集群构成,而每个集群,则是由一个个实例构成的 我们要调用一个服务,nacos会根据我们指定的服务名、集群名,根据负载均衡算法,动态路由到某个特定的 服务实例 ,也就是说, 我们最终调用的实际上是一个实例 总的来说,它是由 阿里巴巴 推出的一个开源项目,是构建以“ 服务 ”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。可 帮助我们快速实现动态服务发现、服务配置、服务元数据及流量管理

02.有哪些特性 ?

1)服务发现和服务健康监测 支持基于 DNS 和基于 RPC 的服务发现 提供对服务的实时的 健康检查 ,阻止向不健康的主机或服务实例发送请求 2)动态 DNS 服务 动态 DNS 服务支持权重路由,可以更容易地实现中间层 负载均衡它使用Ribbon实现负载均衡) 、更灵活的 路由策略 、 流量控制 以及数据中心内网的简单 DNS解析服务 它使用 Ribbon 实现负载均衡 3)服务及其元数据管理 Nacos可以实现从微服务平台建设的视角,管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据

03.安装nacos注册中心

步骤比较简单 1)下载源码或者安装包 安装包地址:https://github.com/alibaba/nacos/releases 2)解压并启动 a Linux/Unix/Mac系统 启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone
b ubuntu系统 或者运行脚本报错提示[[符号找不到,可尝试如下运行:
bash startup.sh -m standalone
c Windows系统 启动命令:
cmd startup.cmd
或者双击 startup.cmd运行文件 3)验证服务 启动成功之后,访问 http://127.0.0.1:8848/nacos ,输入默认用户名、密码: nacos/nacos ,即可 3c4d09eb2b30f4aed4ad2512ff697087.png 好了, nacos注册中心 已经就这样跑起来了~ 由于实战环节,我们会涉及到使用Feign进行服务之间的远程调用,所以先简单介绍一下Feign

04.什么是feign

Feign 是一个声明式的Web Service客户端,使得编写Web Service客户端变得非常容易, 只需要创建一个接口,然后在上面添加注解即可实现服务远程调用

二 实战

demo跑起来

我们将分别演示如何实现生产者、消费者,以及消费者如何调用生产者,针对多个生产者,消费者在调用时又是如何进行选择的这四个功能 由于生产者和消费者均为nacos的客户端,那么,他们需要引入的依赖以及注册中心的配置等基本一致。所以我们将它们放进同一个父项目:nacos_discovery中即可,最后的示例代码框架如下所示 d98210e3ef951d7c2cf25ad22a2cc7f3.png

01.建立父项目

建立父项目-nacos_discovery,配置其pom文件如下
UTF-8UTF-81.8Greenwich.RELEASE2.1.0.RELEASEorg.springframework.bootspring-boot-dependencies2.1.3.RELEASEpomimportorg.springframework.cloudspring-cloud-dependencies${spring.cloud.version}pomimportcom.alibaba.cloudspring-cloud-alibaba-dependencies${spring.cloud.alibaba.version}pomimportorg.projectlomboklomboktruepomimport
需要注意的是,Spring Cloud与SpringBoot之间版本的对应关系,若关系配置不一致,则会出现服务注册不成功等问题 建立好了父级项目,接下来我们分别实现服务生产者和服务消费者

02.建立生产者

建立生产者,也就是说需要建立父级项目的子模块项目了,那么在IDEA中如何建立多模块的项目呢? 杰哥说,这个不难,follow me~ step 1  File -> Project Structure... 4dcfdd7d74727fb6703802bc576d04b6.png step2  选择Module ->点击“+”号,选择New Module  205743092a517c8e91b1840ba636dede.png step3 类型项目选择Maven,并设置jdk 3fc9c683bc9a8d2f8821b438f58557d5.png step4 选择父项目 nacos_discovery,填写项目名称:nacos_provider 82bcb50f0980245e60c94e482be578fb.png step5  点击finish,子项目就建好了 此时查看 nacos_provider 的pom文件,发现它的parent依赖,就是我们选择的父项目 nacos_discovery 61eed2927a886adf2b0759ab248ee413.png 而且父级项目的pom文件中也多了一个名称为nacos_provider的module 772b69f4c33a91f759e9854bf7838685.png 生产者的项目创建好了,接下来看看怎么去实现生产者呢? 我们先做个简单的分析:生产者首先需要把自己的服务发布在注册中心上,供消费者调用,那么就需要为它配置注册中心,并且需要发布服务 1) pom文件
org.springframework.bootspring-boot-starter-webcom.alibaba.cloudspring-cloud-starter-alibaba-nacos              -discoveryorg.springframework.cloudspring-cloud-starter-openfeignorg.projectlomboklombok

分别引入spring-cloud-starter-alibaba-nacos-discovery和

spring-cloud-starter-openfeign,用于服务注册和开启允许被调用功能

2)application.yml配置文件
server:port: ${port:8860} #服务启动端口spring:application:name: nacos-providercloud:nacos:discovery:server-addr: 127.0.0.1:8848
  分别配置服务启动端口、服务名称以及注册中心nacos-server的地址  3)发布服务 创建controller类:ProviderController
@RestController
@Slf4jpublic class ProviderController {@GetMapping("/hello")public String hello(){log.info("provider be invoked!");
return "hello world!";}
}
新建服务“ /hello ” 4)启动类
@SpringBootApplication
@EnableDiscoveryClient //开启服务发现
@EnableFeignClients //开启Feign客户端public class ProviderStartApplication {public static void main(String[] args) {
SpringApplication.run(ProviderStartApplication.class,args);}
}
除了基本注解 @SpringBootApplication 以外,分别添加 @EnableDiscoveryClient (开启服务发现), @EnableFeignClients ( 开启Feign客户端,表示生产者的服务可以被发现,并且可以使用Feign的方式进行调用 5)启动项目,查看nacos服务列表 b063109eea2a199c19278d3781ca1d3b.png 我们看到,服务生产者nacos_provider已成功注册在nacos-server

03.建立消费者

服务消费者的建立过程跟生产者的完全一样,我们直接看如何实现服务消费者 1) pom文件
org.springframework.bootspring-boot-starter-webcom.alibaba.cloudspring-cloud-starter-alibaba-nacos-discoveryorg.springframework.cloudspring-cloud-starter-openfeignorg.projectlomboklombok
同生产者服务引入的依赖完全一样 2)application.yml配置文件
server:
  port: 8877spring:application:name: nacos-consumercloud:nacos:discovery:server-addr: 127.0.0.1:8848
  与生产者的配置项完全一样,分别配置服务启动端口、服务名称以及注册中心 nacos-server 的地址  3)使用feign调用服务
@FeignClient(value = "nacos-provider")public interface ProviderClient {@GetMapping("/hello")
String hello();}
使用feign调用比较简单,只需要新建一个接口,在接口上使用 @
FeignClient声明一下,需要调用的是哪个服务,然后在方法里,使用Restful注解@GetMapping
4)controller
@RestControllerpublic class ConsumerController {@AutowiredProviderClient providerClient;@GetMapping("/callHello")public String callHello(){
String hello = providerClient.hello();
return "invoker provider :hello() ,result"+hello;}
}
使用 @Autoried 注入 ProviderClient 接口,并直接调用它的方法即可 5)启动类
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClientspublic class ConsumerStartApplication {public static void main(String[] args) {
SpringApplication.run(ConsumerStartApplication.class,args);}
}
与生产者启动类中使用的注解完全一样,此处则表明允许消费者服务进行服务发现,并且可以使用Feign进行服务远程调用
当然,消费者只要提供了可以被调用的服务,它也当然可以是生产者,反之亦然
6)启动项目,查看nacos服务列表 2c72cb3c7833db8d2fb61426409547c7.png 可以看到, nacos-consumer 也已成功注册

04.消费者调用生产者

点击详情,可看到消费者的端口即为配置文件中配置的8877 e7119113b9d0022ea5491f54dfcd4a79.png 访问消费者服务:http://192.168.31.95:8877/callHello 06d386420eea6d8226ef6912184478a9.png 我们看到,调用成功,正常返回 那么,到目前为止,我们就分别实现了 服务生产者 、 服务消费者 、以及 消费者使用Feign成功调用生产者 但这样貌似并没有体现出来注册中心的价值,我们知道,生产者服务只有一个实例时,跟消费者直接调用生产者的效果是差不多的。你想啊,这样明明就可以直接调用,为什么还一定要把我们都注册到其他地方,然后再进行调用呢 ?岂不是绕弯路了?

三 进阶

多节点调用

所以,注册中心的真正价值是体现在分布式集群的场景下的 那,你想不想看看当生产者有两个节点的情况,它是如何调用的? 继续, follow me~ 1)配置多节点服务 首先,大家应该注意到了,nacos-provider的配置文件中的端口配置:
server:port: ${port:8860} #服务启动端口
使用${}的方式进行配置。这种格式表示,若启动时指定了端口,则以指定的端口启动,否则就以8860端口启动 那么我们只需要在每次启动时分别配置不同端口,就可以实现启动N个 服务,在IDEA中的话,我们可以通过以下方式进行配置 79a959519e5679d6888413d283a7c140.png fdc8b3b13a1f1bf5eb8a938ae51cafe4.png 2)分别启动服务 8ef5d59780e676469be3e887b4d77b10.png 756170351e2da0a50cdf2a9c2fa0c167.png 3)查看管理端变化 启动以后,查看管理端 fc89a53e762b1e66c9fd6cd757c46d54.png 09ec53b2fbdf07c9ffc52f6676132e9c.png 你会发现此时, nacos-provider 的实例数变成了 2 ,并且服务详情页面里面,显示了两个实例的具体信息 这个时候,再次使用消费者进行调用,由于负载均衡算法默认是 轮询方式 ,因此我们可以通过日志看到,两个生产者服务时 轮流被调用 的

四 总结

总而言之

关于Nacos,今天就先聊到这里,可能你会觉得 特别简单。是的,技术本来就是发展得越来越简单的,上次看到一个段子,说程序员现在每天的生活可轻松了,要实现个什么东西,网上直接找到一段代码,改吧改吧就好了,写代码还有好多自动补全,异常提醒等方便的辅助工具...... 哈哈,可能稍微有些许夸张,但确实有一定的道理啊,技术虽然革新比较快,但是网上的学习资料也越来越多,我们学习的途径也越来越多,当然,在同样的条件下,我们要是停止了学习的步伐,那么可能就要落后喽~ 看完本节,你一定在掌握了: 1、什么是Nacos,如何实现Nacos注册中心 2、如何实现Nacos客户端 3、如何在IDEA中实现多模块项目 4、如何实现feign的远程调用 5、消费者如何实现多实例服务调用 嗯,就这样。每天学习一点,时间会见证你的强大~ 下期预告: Spring Cloud(六):注册中心nacos-站在客户端角度 78bf1d86ae8df5f45d8019ea07215690.png

往期精彩回顾

d301ae381716f311ae957d82294872cc.png Spring Cloud(四):公司内部,关于Eureka和zookeeper的一场辩论赛 Spring Cloud(三):注册中心zookeeper-站在客户端角度 Spring Cloud(二):在实战中深入zookeeper服务端机制 Spring Cloud(一):我与导师的对话:你真的了解zookeeper吗? Spring Boot(十):注册中心Eureka-客户端视角 Spring Boot(九):注册中心Eureka-服务端视角 Spring Boot(八):Spring Boot的监控法宝:Actuator Spring Boot(七):你不能不知道的Mybatis缓存机制! Spring Boot(六):那些好用的数据库连接池们 Spring Boot(五):春眠不觉晓,Mybatis知多少 Spring Boot(四):让人又爱又恨的JPA Spring Boot(三):操作数据库-Spring JDBC SpringBoot(二):第一个Spring Boot项目 SpringBoot(一):特性概览 最近新建了一个微信交流群,里面都是真正对技术感兴趣的小伙伴,欢迎添加讨论~若群名片过期了,可以在后台回复进群,拉你入群哦~

946d931e3706f4cbd28d12ce830a0947.png

也欢迎大家关注们的公众号,一起持续性学习吧~ a207bcecfdf5184689b11bdfa4f4e8e5.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值