微服务、Spring Cloud和SpringCloud Alibaba的相关介绍可以阅读我上一篇文章什么是微服务,为什么会有SpringCloud Alibaba?
1.Nacos介绍
分布式微服务架构中,传统的单体服务被切割成了一个个微服务。比如一个典型的电商系统中,有商品服务、订单服务、仓储服务、物流服务等,这些服务之间相互调用;共同为用户提供服务,但是每个服务可能都部署在不同的机器上,服务之间互相调用的时候;怎么知道对方的的IP和端口呢?当然我们可以将手动的将所有的服务的IP和端口都存储在某个位置,但是当业务高峰期需要扩容的时候或需求变更时;频繁的修改配置太过麻烦也容易出错。
Nacos就是用来解决这些问题的,它是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
2.动态服务发现和配置管理
在每个服务部署完成并启动的时候,将自己的IP和端口等信息告诉Nacos,也就是在Nacos进行服务注册;而一个服务想要调用另一个服务的时候,会先去Nacos中查看另一个服务的IP和端口,然后发送请求。当某个服务停止或故障的时候,Nacos一段时间内收不到该服务的心跳包,就会删除该服务的注册信息。
另外,每个服务的各项配置可能不尽相同,传统开发中,如果要修改某个配置的话,肯定是需要修改配置文件然后重启;在微服务架构中,如果有几十个服务都要修改配置,显然一个一个修改并重启是不太合适的;这就需要引入Nacos做配置中心,在Nacos上根据不同的环境写好配置文件;在服务中只需要指定该服务使用哪个配置文件即可,如果配置文件有修改,也只需要修改Nacos上的配置文件即可;服务的配置会自动同步,配置中心部分下文会做出详细的说明和演示。
值得一提的是在Spring Cloud中服务注册中心和配置中心是分成两个独立的组件Eurka或Config,但Nacos后来者居上;借鉴(抄)了两者的设计思想,将服务注册中心和服务配置中心合并成了一个组件。并优化了一些原组件的不足之处。经过了国内双十一等各种大型流量场景的考验。
3.安装
目前最新的版本是 2.0.2(截止2021年7月15日)
3.1下载
可以直接在github发布页上面下载需要的版本。
我已经下载了Linux和Windows版本,如果嫌外网网速太慢的朋友可以关注我的公众号【技术杂汇】或扫描下面的二维码,关注并回复【nacos】即可获得云盘下载链接
3.2 Windows下启动
下载之后,解压即用无需安装;在Windows平台启动方式为,解压后进入bin目录
启动命令行工具,在当前目录下执行命令
startup.cmd -m standalone
-m 指定启动模式,standalone 为单机启动
看到如下输出即为启动成功
启动默认端口是8848,启动之后可以访问http://localhost:8848/nacos
会访问到如下界面
,默认的账号的密码都是nacos
,
这便是nacos的管理界面,里面的内容,后文会有详解。
4.项目实战
下面本文将演示在项目中如何进行服务注册
首先创建一个父项目spring-cloud-alibaba-demo
修改父项目的打包方式为pom,引入 Spring Boot和 SpringCloud Alibaba 的依赖管理
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
spring-boot-dependencies
和spring-cloud-alibaba-dependencies
不会引入任何依赖,只是在父工程中管理所有依赖的版本,父项目中已经指定的以来版本;子模块引入时就不需要再指定版本,避免依赖版本造成的问题。
父工程创建完成,接下来创建一个商品微服务commodity-provider-8081
,并将它注册进Nacos
引入Nacos客户端-服务发现版(discovery),这里不需要指定版本;因为父工程中已经有依赖管理
<!-- web服务 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Nacos 客户端-注册中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 监控当前应用的健康状态 nacos 依赖于它 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
创建application.yml文件,主要的配置项如下
server:
port: 8081
spring:
application:
name: commodity-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848
management:
endpoints:
web:
exposure:
include: '*'
新建一个controller包并在这个包下创建一个简单的CommodityController类;用作的web接口测试。
@RestController
public class CommodityController {
@GetMapping("/hello")
public String hello() {
return "hello nacos";
}
}
创建服务启动类
@SpringBootApplication
@EnableDiscoveryClient
public class CommodityProvider8081 {
public static void main(String[] args) {
SpringApplication.run(CommodityProvider8081.class,args);
}
}
@EnableDiscoveryClient
注解的作用是,开启commodity-provider-8081
服务作为Nacos客户端的身份,commodity-provider-8081
服务以Nacos客户端的身份将自己注册到Nacos服务端,换句话说:Nacos是服务发现的服务端(server);commodity-provider-8081
是服务发现的客户端(client)
访问http://localhost:8081/hello
web服务可以正常访问
再进入Nacos的界面http://localhost:8848/nacos
该服务已经成功注册,可以看到服务名称就是配置文件中的spring.application.name
所对应的配置,并且有一个健康的实例;就是我刚才注册的这个。
本人能力有限,本文只是我个人的技术分享。如有错误或不实之处;恳请大家不吝赐教。可以在公众号【技术杂汇】留言讨论;本人定虚心学习。
如果这个篇文章帮到你,可以帮我点个赞吗或者点个关注,这将激励着我继续分享我的技术所得