SpringCloud技术栈
注册中心:eureka(闭源)、zookeeper、consul、nacos
服务调用:ribbon、openFeign
服务降级:hystrix、resilience4j、sentienl
服务网关:zuul(阻塞异步)、zuul2(未整合)、gateway(非阻塞异步)
服务配置:config、nacos
服务总线:bus、nacas
一、注册中心
1、eureka配置(AP架构)
eureka虽然2.x版本闭源了,但是1.x版本依旧可以使用,下面列出eureka的常规配置,可根据自己的需要进行修改
1.1、添加eureka依赖
客户端:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
服务端:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
1.2、配置文件
服务端配置文件(application.yml):
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名字
client:
#表识不向注册中心注册自己
register-with-eureka: false
#表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
fetch-registry: false
service-url:
#设置与eureka server交互的地址,查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7002.com:7002/eureka/
server:
#fasle: 表示eureka server7001关闭自我保护机制,保证不可用服务被及时踢除
enable-self-preservation: false
eviction-interval-timer-in-ms: 20000 #自我保护时间
客户端配置文件(application.yml):
server:
port: 8001
spring:
application:
name: cloud-payment-service
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/db2020
username: root
password: root
eureka:
client:
register-with-eureka: true
fetchRegistry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka, http://eureka7002.com:7002/eureka
instance:
instance-id: payment8001 #主机名称
prefer-ip-address: true #访问信息有IP信息提示
#心跳检测与续约时间
#开发时没置小些,保证服务关闭后注册中心能及时剔除服务
#Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
lease-renewal-interval-in-seconds: 1
#Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
lease-expiration-duration-in-seconds: 2
1.3、启动类配置
a)服务端启动类需要加上@EnableEurekaServer
注解
b)客户端启动类需要加上@EnableEurekaClient
注解
2、zookeeper配置(CP架构)
zookeeper是一个分布式协调工具,可以实现注册中心功能;
2.1、安装虚拟机及JDK
(1)安装虚拟机(virtual box、VMware):略
(2)下载CentOS7镜像:略
(3)安装镜像:略
(4)安装JDK及配置环境变量:略
(5)下载zookeeper安装包 https://zookeeper.apache.org/releases.html
推荐阿里提供的镜像 https://mirrors.aliyun.com/centos/
可供选择版本:(建议选【DVD】标准版本)
【DVD】标准版本
【Everything】集成所有软件版本
【LiveGNOME】GNOME桌面版本
【LiveKDE】KDE桌面版本
【Minimal】最小安装版本
【NetInstall】网络安装镜像版本
2.2、搭建zookeeper服务端(单机)
2.2.1、安装zookeeper
使用Xshell连接虚拟机(略)
(1)切换到/opt目录并上传zookeeper安装包
cd /opt #切换到opt目录
#将zookeeper安装上传到opt目录(直接将安装包拖入)
ls #查看当前当前目录下的子目录或文件
(2)解压zookeeper安装包
tar -zxvf apache-zookeeper-3.5.9-bin.tar.gz
ls #查看当前当前目录下的子目录或文件
(3)对解压后的文件(apache-zookeeper-3.6.3-bin)重命名
mv apache-zookeeper-3.6.3-bin zookeeper #重命名文件
ls #查看当前当前目录下的子目录或文件
(4)删除zookeeper压缩包
rm -rf apache-zookeeper-3.6.3-bin.tar.gz #删除文件
ls #查看当前当前目录下的子目录或文件
(5)创建zoo.cfg文件
cd zookeeper/conf #切换到zookeeper的配置文件目录下
cp zoo_sample.cfg zoo.cfg #创建zoo.cfg配置文件
ls #查看当前当前目录下的子目录或文件
2.2.2、启动zookeeper
(1)切换到bin目录
cd /opt/zookeeper/bin #切换到zookeeper的bin目录
ls #查看当前当前目录下的子目录或文件
(2)查看zookeeper启动状态
./zkServer.sh status #查看状态 start:启动;stop:停止;status:运行状态
(3)启动zookeeper
./zkServer.sh start
(4)客户端连接测试
./zkCli.sh
若是连接不成功,看看是不是端口被占用
2.3、搭建zookeeper集群(略)
3、consul配置(CP架构)
3.1、下载consul
官方下载网址:https://www.consul.io/downloads
3.2、安装consul
(1)构建consul目录
mkdir /opt/consul #创建目录consul
cd /opt/consul #切换到consul目录
unzip #确认安装了unzip
(2)上传并解压consul安装包
unzip consul_1.10.2_linux_amd64.zip #解压安装包
3.3、启动consul
关闭防火墙
systemctl stop firewalld
启动consul
./consul agent -dev -ui -node=consul-dev -client=192.168.179.131 #启动consul
访问: http://192.168.179.131:8500
二、服务调用
1、Ribbon(客户端负载均衡)
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。
简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。
1.1、Ribbon架构说明
Ribbon在工作时分成两步:
第一步先选择EurekaServer ,它优先选择在同一个区域内负载较少的server。
第二步再根据用户指定的策略,在从server取到的服务注册列表中选择一个地址。
1.2、使用Ribbon
(1)添加依赖
Eureka依赖整合Ribbon,可以不用另外在引入Ribbon依赖
<dependency>
<groupld>org.springframework.cloud</groupld>
<artifactld>spring-cloud-starter-netflix-ribbon</artifactid>
</dependency>
(2)构建RestTemplate(调用服务)
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced //使用@LoadBalanced注解赋予RestTemplate负载均衡的能力
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
使用@LoadBalanced注解赋予RestTemplate负载均衡的能力
(3)自定义负载均衡策略
@Configuration
public class MySelfRule {
@Bean
public IRule myRule(){
// new RetryRule()
// new RoundRobinRule() //轮询
return new RandomRule();//随机
}
}
官方文档明确给出了警告:
这个自定义配置类不能放在@ComponentScan所扫描的当前包下以及子包下,
否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,达不到特殊化定制的目的了。
@SpringBootApplication注解查看源码发现有@ComponentScan注解,所以规则类不能放在启动类的所在包及子包下
Ribbonf负载均衡策略:
a、RoundRobinRule:轮询
b、RandomRule:随机
c、RetryRule:先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重
d、WeightedResponseTimeRule:权重,响应速度越快的实例选择权重越大,越容易被选择
e、BestAvailableRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
f、AvailabilityFilteringRule:先过滤掉故障实例,再选择并发较小的实例
g、ZoneAvoidanceRule:默认规则,复合判断server所在区域的性能和server的可用性选择服务器
Ribbon轮询算法原理:
rest接口第几次请求数 % 服务器集群总数量 = 实际调用服务器位置下标
每次服务重启动后rest接口计数从1开始。
(4)主启动类添加@RibbonClien注解
@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration = MySelfRule.class)//使用自定义负载均衡方式
public class OrderMain9001 {
public static void main(String[] args) {
SpringApplication.run(OrderMain9001.class,args);
}
}
2、OpenFeign
Feign是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单。它的使用方法是定义一个服务接口然后在上面添加注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。
Feign和OpenFeign的区别:
Feign | OpenFeign |
---|---|
Feign是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端;Feign内置了Ribbon,用来做客户端负载均衡;Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务。 | OpenFeign是SpringCloud在Feign的基础上支持了SpringMVC的注解,如@RequesMapping等等。OpenFeign的@Feignclient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。 |
2.1、OpenFeign使用
(1)添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
(2) 消费端启动类添加@EnableFeignClients注解
@SpringBootApplication
@EnableFeignClients
public class OrderFeignMain9001 {
public static void main(String[] args) {
SpringApplication.run(OrderFeignMain9001.class,args);
}
}
(3)业务逻辑 Service 接口添加@FeignClient注解
@Component
@FeignClient("CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService {
@PostMapping(value = "/provider/getPayment")
CommonResult<Payment> getPayment(@RequestBody Payment payment);
@GetMapping(value = "/provider/feign/timeout")
String paymentFeignTimeout();
}
OpenFeign的@Feignclient可以解析SpringMVC的注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
2.2OpenFeign超时控制
在yml文件中配置
#设置feign客户端超时时间(OpenFeign默认支持ribbon)(单位:毫秒)
ribbon:
#指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
ReadTimeout: 5000
#指的是建立连接后从服务器读取到可用资源所用的时间
ConnectTimeout: 5000
2.3 OpenFeign日志打印
Feign提供了日志打印功能,我们可以通过配置来调整日恙级别,从而了解Feign 中Http请求的细节。就是对Feign接口的调用情况进行监控和输出.
(1)配置日志bean
@Configuration
public class FeignConfig {
// NONE:默认的,不显示任何日志;
// BASIC:仅记录请求方法、URL、响应状态码及执行时间;
// HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息;
// FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据。
@Bean
Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;
}
}
(2)YML文件里需要开启日志的Feign客户端
logging:
level:
# feign日志以什么级别监控哪个接口
com.tedu.cloud.service.PaymentFeignService: debug