大家好,我是杰哥,转眼间,我们的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文件如下
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<!--注意版本对应关系 -->
<spring.cloud.version>Greenwich.RELEASE</spring.cloud.version>
<spring.cloud.alibaba.version>2.1.0.RELEASE</spring.cloud.alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--lombok工具依赖,可简化很多操作,如日志打印、构造方法、get\set方法等。-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
需要注意的是,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文件
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos -discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 主要为了输出日志-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
分别引入spring-cloud-starter-alibaba-nacos-discovery和
spring-cloud-starter-openfeign,用于服务注册和开启允许被调用功能
2)application.yml配置文件
server:
port: ${port:8860} #服务启动端口
spring:
application:
name: nacos-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
分别配置服务启动端口、服务名称以及注册中心nacos-server的地址
3)发布服务
创建controller类:ProviderController
@RestController
@Slf4j
public 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文件
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 主要为了输出日志-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
同生产者服务引入的依赖完全一样
2)application.yml配置文件
server:
port: 8877spring:
application:
name: nacos-consumer
cloud:
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
@RestController
public class ConsumerController {
@Autowired
ProviderClient providerClient;
@GetMapping("/callHello")
public String callHello(){
String hello = providerClient.hello();
return "invoker provider :hello() ,result"+hello;
}
}
使用@Autoried注入ProviderClient接口,并直接调用它的方法即可
5)启动类
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public 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-站在客户端角度
本文暂时没有评论,来添加一个吧(●'◡'●)