1、什么是微服务?
就是将一个大的应用拆分为多个小的模块,每个模块都有自己的功能和职责,不同模块之间可以进行交互,这就是微服务
2、六大基础原则
职责单一、服务独立、可扩展、可替换、可重用、高容错
Springcloud的五大组件
Eureka 服务注册与发现
Ribbon 负载均衡
Hystrix 熔断器
Gateway 网关
Nacos 配置中心
一、Eureka 服务与注册中心(AP)
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务(CP)
1、使用方式(服务的注册)
(1)启动器
spring-cloud-starter-netfix-eureka-server
(2)配置文件application.properties
服务端的配置文件
# 服务端端口
server.port=8761
# 服务端应用名称
spring.application.name=eureka-server
# 服务端每隔10s定期删除不与服务端联系的客户端
eureka.server.evication.interval.time.in.ms=10000
# 续约百分比 超过阈值(85%)的应用没有和服务端续约,则eureka会保护服务,不会删除任何客户端
eureka.server.renewal.percent.threshold=0.85
客户端的配置文件
# 应用端口
server.port=8080
# 应用名称
spring.application.name=eureka-client
# 指定注册的地址
eureka.client.service.url.defaultZone:hppt://localhost:8761/eureka
# 可以不往服务端注册
eureka.client.register.with.eureka=true
# 客户端是否去服务端拉取服务列表
eureka.client.fetch.registry=true
# 客户端每隔10s去服务端拉取服务列表,缓解脏读问题,时间越小,脏读越少,性能消耗越大
eureka.client.registry.fetch.interval.seconds=10
(3)启动类添加注解
服务端启动类添加的注解
@EnableEurekaServer
客户端启动类添加的注解
@EnableEurekaClient
2、注册中心集群(去中心化模式,更加高可用)
去中心化模式中没有主从的概念,eureka会将数据进行广播和扩散
# 服务端端口1
server.port=8761
# 服务端应用名称
spring.application.name=eureka-server
eureka.client.service.url.defaultZone:hppt://localhost:8762/eureka,hppt://localhost:8763/eureka
# 服务端每隔10s定期删除不与服务端联系的客户端
eureka.server.evication.interval.time.in.ms=10000
# 续约百分比 超过阈值(85%)的应用没有和服务端续约,则eureka会保护服务,不会删除任何客户端
eureka.server.renewal.percent.threshold=0.85
-------------------------------------------------
# 服务端端口2
server.port=8762
# 服务端应用名称
spring.application.name=eureka-server
# 指定注册的地址
eureka.client.service.url.defaultZone:hppt://localhost:8761/eureka,hppt://localhost:8763/eureka
# 服务端每隔10s定期删除不与服务端联系的客户端
eureka.server.evication.interval.time.in.ms=10000
# 续约百分比 超过阈值(85%)的应用没有和服务端续约,则eureka会保护服务,不会删除任何客户端
eureka.server.renewal.percent.threshold=0.85
-------------------------------------------------
# 服务端端口3
server.port=8763
# 服务端应用名称
spring.application.name=eureka-server
# 指定注册的地址
eureka.client.service.url.defaultZone:hppt://localhost:8761/eureka,hppt://localhost:8762/eureka
# 服务端每隔10s定期删除不与服务端联系的客户端
eureka.server.evication.interval.time.in.ms=10000
# 续约百分比 超过阈值(85%)的应用没有和服务端续约,则eureka会保护服务,不会删除任何客户端
eureka.server.renewal.percent.threshold=0.85
3、服务的发现
@RestController
public class DiscoveryController {
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("test")
public String doDiscovery(String serviceName) {
// 服务发现
List<ServiceInstance> instances = discoveryClient.getInstances(serviceName);
//
}
}
二、Ribbon 负载均衡
1、实现原理
一个URL请求过来,ribbon如何做到负载均衡
(1)拦截请求
(2)截取主机名称
(3)借助eureka来做服务发现
(4)通过负载均衡算法,拿到一个服务器的IP和端口
(5)重构URL
(6)发起请求
只要在发起请求的RestTemplate类上面加上@LoadBlanced即可让Ribbon托管,通过轮询的负载均衡算法进行请求
2、feign 远程调用
(1)在启动类添加@EnableFeignClients,开启feign的客户端功能,才可以帮助我们发起远程调用
(2)远程调用接口
// value是服务提供者的应用名称
@FeignClient(value = "order-service")
public interface UserOrderFeign {
// 远程调用服务的方法签名
@GetMapping("doOrder")
public String doOrder();
}
(3)直接使用@Autowired注入,就可以使用远程服务方法了
@Autowired
private UserOrderFeign userOrderFeign;
三、Hystrix 熔断器
1、服务雪崩
服务雪崩的核心本质是线程没有及时回收
客户端去请求A的服务,A的tomcat会分配一个线程支持用户的访问,A需要去调用B的服务,B需要去调用C的服务,服务C挂了,B不知道,AB依旧去访问C,导致A和B得线程都没有回收,此时大量请求进入AB服务,AB会报错,整个业务线都瘫痪,服务雪崩
2、简介
熔断器在正常情况下,熔断器是关着的,只有出了问题才打开;
熔断器是用来保护微服务不雪崩的方法,能够阻止分布式系统中出现联动故障。
当有服务发生调用的时候才会发生服务雪崩,所以hystrix常和feign,ribbon一起使用;
3、实现步骤
(1)POM文件导入需要的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
(2)写远程服务调用接口的实现类,需要在实现类上加@Component注解,加入IOC容器,用于spring管理,创建Bean
(3)客户端配置文件中启动熔断
# 应用端口
server.port=8080
# 应用名称
spring.application.name=eureka-client
# 指定注册的地址
eureka.client.service.url.defaultZone:hppt://localhost:8761/eureka
# 可以不往服务端注册
eureka.client.register.with.eureka=true
# 客户端是否去服务端拉取服务列表
eureka.client.fetch.registry=true
# 客户端每隔10s去服务端拉取服务列表,缓解脏读问题,时间越小,脏读越少,性能消耗越大
eureka.client.registry.fetch.interval.seconds=10
#开启熔断
feign.hystrix.enabled=true
(4)指定远程服务调用失败走那个方法
// value是服务提供者的应用名称 CustomerFrignHystrix是CustomerFrign的实现类
@FeignClient(value = "order-service", fallback=CustomerFrignHystrix.class)
public interface CustomerFrign{
// 远程调用服务的方法签名
@GetMapping("rent")
public String rent();
}
四、Gateway 网关
1、作用
网关是微服务最边缘的服务,直接暴露给用户,用来做用户和微服务的桥梁
(1)路由转发
(2)安全控制,保护每个服务,不需要将每个服务的端口暴露出去
(3)负载均衡
2、核心逻辑
路由转发+执行过滤器链
3、nginx 和 gateway
nginx是服务器级别的网关,gateway是项目级别的网关,一个服务器上可以部署多个项目
4、实现步骤
(1)导入依赖,网关默认开启,需要在配置文件中配置网关的端口
gateway-server
五、Nacos 配置中心
NacosServer是需要安装的,我们不需要配置,只需要将服务注册上NacosServer就行
版本发布的时候会有特定的人去做,我们需要做的就是去Nacos上建立相应的文件,文件夹里面就是我们的配置信息,在进行本地调试的时候