文章目录
1 服务架构
单体架构
业务所有功能集中在一个项目
优点:架构简单、部署成本低
缺点:耦合度高
分布式架构
根据业务功能对系统进行拆分,每个业务模块作为独立项目
优点:降低服务耦合、有利于服务升级扩展
微服务
一种经过良好架构设计的分布式架构方案
特征
-
单一职责
-
面向服务
-
自治
-
隔离性强
微服务技术对比
比较springcloud和springboot详细版本对应:https://start.spring.io/actuator/info
微服务架构组件更新换代
2 微服务使用
服务拆分
注意事项
-
不同微服务,不要重复开发相同业务
-
微服务数据独立,不要访问其它微服务的数据库
-
微服务可以将自己的业务暴露为接口,供其它微服务调用
服务远程调用
在服务启动类中注册RestTemplate,在service注入RestTemplate发送http请求,调用其它服务
服务调用关系
-
服务提供者:暴露接口给其它服务调用
-
服务消费者:调用其它服务提供的接口
一个服务既可以是提供者也可以是消费者
3 Eureka注册中心
原理
eureka-server:服务端,注册中心
eureka-client:客户端,所有微服务
eureka作用
-
服务提供者启动时向eureka注册自己信息
-
eureka保存这些信息
-
消费者根据服务名称向eureka拉取提供者信息
-
服务消费者利用负载均衡算法,从服务列表中挑选一个服务提供者
-
服务提供者每隔30秒向注册中心发送心跳请求,报告健康状态
-
eureka更新记录服务列表信息,心跳不正常会被剔除
-
消费者可以拉取到最新信息
搭建注册中心
- 引入依赖
父工程加入springcloud依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
当前工程加入eureka-server依赖
<dependencies>
<!--eureka服务端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
-
启动类加上注解@EnableEurekaServer
-
配置文件
server:
port: 8081 #服务端口
spring:
application:
name: eurekaserver #eureka服务名称
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8081/eureka #eureka地址
访问localhost:8081
服务注册
- 添加eureka-client依赖,注意要有spring-boot-starter-web依赖,不然服务启动失败
<dependencies>
<!--eureka客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
-
启动类添加@EnableEurekaClient注解
-
配置文件
server:
port: 8082 #服务端口
spring:
application:
name: userservice #服务名称
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8081/eureka #eureka地址
一个服务注册多个实例
idea-services, 某个服务右键-copy configuration
修改服务名称,修改环境配置VM options: -Dserver.port=xxx
服务发现
调用其它服务时用服务名称代替ip和端口
在启动类的RestTemplate添加负载均衡注解@LoadBalanced
-
注入DiscoveryClient
-
discoveryClient.getServices()获取所有服务
-
discoveryClient.getInstances()获取一个服务下的所有实例
-
启动类加入@EnableDiscoveryClient注解
@EnableDiscoveryClient和@EnableEurekaClient共同点就是:都是能够让注册中心能够发现,扫描到该服务。
@EnableEurekaClient只适用于Eureka作为注册;@EnableDiscoveryClient 可以是其他注册中心。
搭建集群
目的:高可用,提高故障容错率,集群内部每台eureka相互注册
server:
port: 8761
eureka:
instance:
hostname: eureka8761 #eureka服务端实例名称
client:
register-with-eureka: false #不需要注册自己
fetch-registry: false #不需要检索服务
service-url:
defaultZone: http://eureka8861:8861/eureka/ #eureka地址
server:
port: 8861
eureka:
instance:
hostname: eureka8861 #eureka服务端实例名称
client:
register-with-eureka: false #不需要注册自己
fetch-registry: false #不需要检索服务
service-url:
defaultZone: http://eureka8761:8761/eureka/ #eureka地址
actuator信息完善
加入spring-boot-starter-actuator依赖
服务配置实例id、访问路径显示ip地址
eureka:
instance:
instance-id: mall-user-service8081
prefer-ip-address: true #访问路径可以显示ip
自我保护
某时刻一个微服务不可用,Eureka不会立刻清理,依旧保留该服务的信息
防止Eureka客户端本身健康,但出现网络分区故障的情况下清理客户端的信息
属于CAP里面的AP分支
禁止自我保护:
eureka服务端
eureka:
server:
enable-self-preservation: false #关闭自我保护机制
eviction-interval-timer-in-ms: 2000 #剔除服务的间隔时间
eureka客户端
eureka:
instance:
lease-renewal-interval-in-seconds: 1 #eureka客户端向服务端发送心跳的时间间隔
lease-expiration-duration-in-seconds: 2 #eureka服务端在收到最后一次心跳后等待时间上限,超时将剔除服务