点击蓝字关注我们
大家好,我是杰哥,转眼间,我们的Spring Cloud专辑已到了第五次分享,而我们的注册中心篇章已经分别完成了Eureka、zookeeper篇,今天正式进入 nacos篇 的学习 nacos作为注册中心和配置中心,这两年的热度还是挺高的。尤其是Eureka官方已经宣布Eureka2.0将会停止维护,naocs则变得更有优势。 它的版本更迭相对来说也比较快,按照目前的势头,相信会渐渐成长为Spring Cloud中配置中心和注册中心的独一无二的注册中心选择 本次文章只涉及nacos作为注册中心的部分功能,关于配置中心,则是我们注册中心篇结束之后的另一个篇章,敬请期待哦~一 入门
初识nacos
01.什么是nacos
先来看看它的名字 Nacos,Na、co字母分别为 Naming 和 Configuration 的前两个字母,s 为Service 这个是官网上关于 Nacos服务的分级存储模型 其实,分布式服务都基本如此。比如我们说,一个订单服务,可以分为不同环境,如开发、测试、生产环境,每个环境则是由一个集群构成,而每个集群,则是由一个个实例构成的 我们要调用一个服务,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
,即可
好了,
nacos注册中心
已经就这样跑起来了~
由于实战环节,我们会涉及到使用Feign进行服务之间的远程调用,所以先简单介绍一下Feign
04.什么是feign
Feign 是一个声明式的Web Service客户端,使得编写Web Service客户端变得非常容易, 只需要创建一个接口,然后在上面添加注解即可实现服务远程调用二 实战
demo跑起来
我们将分别演示如何实现生产者、消费者,以及消费者如何调用生产者,针对多个生产者,消费者在调用时又是如何进行选择的这四个功能 由于生产者和消费者均为nacos的客户端,那么,他们需要引入的依赖以及注册中心的配置等基本一致。所以我们将它们放进同一个父项目:nacos_discovery中即可,最后的示例代码框架如下所示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... step2 选择Module ->点击“+”号,选择New Module step3 类型项目选择Maven,并设置jdk step4 选择父项目 nacos_discovery,填写项目名称:nacos_provider step5 点击finish,子项目就建好了 此时查看 nacos_provider 的pom文件,发现它的parent依赖,就是我们选择的父项目 nacos_discovery 而且父级项目的pom文件中也多了一个名称为nacos_provider的module 生产者的项目创建好了,接下来看看怎么去实现生产者呢? 我们先做个简单的分析:生产者首先需要把自己的服务发布在注册中心上,供消费者调用,那么就需要为它配置注册中心,并且需要发布服务 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服务列表
我们看到,服务生产者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服务列表
可以看到,
nacos-consumer
也已成功注册
04.消费者调用生产者
点击详情,可看到消费者的端口即为配置文件中配置的8877 访问消费者服务:http://192.168.31.95:8877/callHello 我们看到,调用成功,正常返回 那么,到目前为止,我们就分别实现了 服务生产者 、 服务消费者 、以及 消费者使用Feign成功调用生产者 但这样貌似并没有体现出来注册中心的价值,我们知道,生产者服务只有一个实例时,跟消费者直接调用生产者的效果是差不多的。你想啊,这样明明就可以直接调用,为什么还一定要把我们都注册到其他地方,然后再进行调用呢 ?岂不是绕弯路了?三 进阶
多节点调用
所以,注册中心的真正价值是体现在分布式集群的场景下的 那,你想不想看看当生产者有两个节点的情况,它是如何调用的? 继续, follow me~ 1)配置多节点服务 首先,大家应该注意到了,nacos-provider的配置文件中的端口配置:server:port: ${port:8860} #服务启动端口
使用${}的方式进行配置。这种格式表示,若启动时指定了端口,则以指定的端口启动,否则就以8860端口启动
那么我们只需要在每次启动时分别配置不同端口,就可以实现启动N个
服务,在IDEA中的话,我们可以通过以下方式进行配置
2)分别启动服务
3)查看管理端变化
启动以后,查看管理端
你会发现此时,
nacos-provider
的实例数变成了
2
,并且服务详情页面里面,显示了两个实例的具体信息
这个时候,再次使用消费者进行调用,由于负载均衡算法默认是
轮询方式
,因此我们可以通过日志看到,两个生产者服务时
轮流被调用
的
四 总结
总而言之
关于Nacos,今天就先聊到这里,可能你会觉得 特别简单。是的,技术本来就是发展得越来越简单的,上次看到一个段子,说程序员现在每天的生活可轻松了,要实现个什么东西,网上直接找到一段代码,改吧改吧就好了,写代码还有好多自动补全,异常提醒等方便的辅助工具...... 哈哈,可能稍微有些许夸张,但确实有一定的道理啊,技术虽然革新比较快,但是网上的学习资料也越来越多,我们学习的途径也越来越多,当然,在同样的条件下,我们要是停止了学习的步伐,那么可能就要落后喽~ 看完本节,你一定在掌握了: 1、什么是Nacos,如何实现Nacos注册中心 2、如何实现Nacos客户端 3、如何在IDEA中实现多模块项目 4、如何实现feign的远程调用 5、消费者如何实现多实例服务调用 嗯,就这样。每天学习一点,时间会见证你的强大~ 下期预告: Spring Cloud(六):注册中心nacos-站在客户端角度往期精彩回顾
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(一):特性概览 最近新建了一个微信交流群,里面都是真正对技术感兴趣的小伙伴,欢迎添加讨论~若群名片过期了,可以在后台回复进群,拉你入群哦~ 也欢迎大家关注们的公众号,一起持续性学习吧~