一、服务拆分原则
微服务根据业务模块拆分,做到单一职责,不要重复开发相同业务
微服务可以将业务暴露为接口,供其他微服务使用
不同微服务都应该有自己独立的数据库
eg:在订单模块中返回订单信息及用户信息,单体(直接从数据库分别查询用户表和订单表),微服务(订单模块->
订单数据库,订单模块->用户模块->用户数据库->返回给订单模块)
二、Eureka注册中心
1.服务远程调用--提供者和消费者
服务提供者:一次业务中,被其他微服务调用的服务。(提供接口给其他服务)
服务消费者:一次业务中,调用其他微服务的服务。(调用其他微服务提供的接口)
2.Eureka作用--注册服务信息、心跳监控、拉取服务
每个微服务模块在启动时,会将服务信息注册到Eureka、并持续监控每个服务的状态,
当有服务挂掉后,会将该服务踢出注册中心,当调用某个模块时,Eureka会拉取该服务,
如果该服务采用集群,Eureka会采用负载均衡策略调用
3.Eureka搭建(服务端)
(1) 新建eureka-server模块,引入依赖
注:如果不通过父工程统一管理版本依赖,在子工程中使用需要指定具体版本
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
(2)编写启动类 添加添加@EnableEurekaServer注解
(3)编写配置文件
server:
port: 10086 # 服务端口(自定义)
spring:
application:
name: eureka-server # eureka注册中心的服务名称
eureka:
instance:
hostname: ssm-eureka #指定 Eureka 实例(主机名),这个主机名在 Eureka 集群内部被用来互相发现和通信
client:
register-with-eureka: false #自己不往服务端注册
fetch-registry: false #不需要从 Eureka 服务注册中心获取服务实例的注册信息(因为它直接管理这些信息
service-url: #指定了 Eureka 客户端应该连接以获取服务注册信息的 Eureka 服务器的 URL
defaultZone: http://127.0.0.1:10086/eureka
4.服务注册(客户端)
(1)引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
(2)编写配置文件
spring:
application:
name: user-server # 注册中心的服务名称
eureka:
client:
service-url: # eureka的地址信息
defaultZone: http://127.0.0.1:10086/eureka
三、Nacos注册中心
1.nacos启动(搭建nacos环境)
解压后,在bin目录下,采用命令行方式启动startup.cmd -m standalone(-m为启动模式 为单机启动)
登录账号密码都为nacos
2.服务注册--添加nacos客户端依赖,不用配置管理端,nacos直接解压可用,与Eureka不同。
注:如果不通过父工程统一管理版本依赖,在子工程中使用需要指定具体版本
在父工程的pom文件中的`<dependencyManagement>`中引入SpringCloudAlibaba的管理依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
在子工程的pom文件中引入nacos-discovery依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
编写配置文件,nacos服务端地址(nacos配置属于spring配置)
spring:
cloud:
nacos:
server-addr: localhost:8848 # nacos服务端地址
3.nacos服务分级存储
(1) 前言 一个服务可以有多个实例,例如我们的user-service,可以有:
-
127.0.0.1:8081
-
127.0.0.1:8082
-
127.0.0.1:8083
假如这些实例分布于全国各地的不同机房,例如:
-
127.0.0.1:8081,在上海机房
-
127.0.0.1:8082,在上海机房
-
127.0.0.1:8083,在杭州机房
Nacos就将同一机房内的实例划分为一个集群。 当微服务互相访问时,应该尽可能先访问同集群实例,因为本地访问速度更快。当本集群内不可用时,才访问其它集群。
- 总结:Nacos引入集群概念就是为了防止出现跨集群调用,尽可能的避免。
(2) 配置集群 修改子工程user-service服务的application.yml文件,添加集群配置:
spring:
cloud:
nacos:
server-addr: localhost:8848 # nacos服务端地址
discovery:
cluster-name: HZ # 集群名称,也就是机房所在位置
- 注意:springboot多实例修改端口等配置时可在修改选项->覆盖配置属性中重新赋值。
4.nacos负载均衡
(1) 同集群优先的负载均衡
默认为轮询,但要想优先访问同集群下的服务时(效率高),可修改配置来实现。
eg: order为单实例 SH集群, user为3实例 1HZ集群 2SH集群。
order调用user模块时想优先调用SH集群,要在order的yaml文件中修改负载均衡规则:
user-service: # 要调用的微服务名称
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
(优先访问同集群服务,在同集群下随机访问服务)
- 至此可以实现同集群优先调用,当本地集群都无法调用时则会选择其他集群并给出警告信息。
(2) 同集群下修改权重
- 找到user-service的实例列表,点击编辑,即可修改权重 (权重越大,访问频率越高):
5.环境隔离
(1) 前言
Nacos提供了namespace来实现多环境隔离功能。
- nacos中可以有多个namespace
- namespace下可以有group、service等
- 不同namespace之间相互隔离,例如不同namespace的服务互相不可见
(2) 配置
- 默认情况下,所有service、data、group都在同一个namespace,名为public:
- 我们可以点击页面新增按钮,添加一个namespace(id为空会自动生成):
- 给微服务配置namespace只能通过修改配置来实现。例如修改order-service的application.yml文件:
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ
namespace: 75d4133b-131c-4082-883a-01301f8e6156 # 命名空间,填上述ID
- 重启order-service后,访问控制台,可以看到下面的结果:
- 此时访问order-service,因为所在namespace不同,会导致找不到userservice,控制台会报错:
四、Nacos与Eureka区别
(1)Nacos的服务实例分为两种类型:
- 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。
- 非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例。
配置一个服务实例为永久实例:
spring:
cloud:
nacos:
server-addr: localhost:8848 # nacos服务端地址
discovery:
ephemeral: false # 设置为非临时实例
(2)Nacos与eureka的共同点
- 都支持服务注册和服务拉取 (拉取一次后存在缓存中,定时再去注册中心拉取更新数据)
- 都支持服务提供者心跳方式做健康检测
(3)Nacos与Eureka的区别
- Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式。
- Nacos临时实例心跳不正常会被剔除,非临时实例则不会被剔除。Eureka会30秒进行一次心跳续约,当有服务挂掉后,会踢出注册中心。
- Nacos支持服务列表变更的消息推送模式,服务列表更新更及时(当服务列表更新变化时会立即更新缓存列表数据)
- Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式-