- 一、service provider 服务提供者
- 服务的注册和发现
- pom.xml 添加 eureka 客户端依赖
- 上面的 *** 作会在pom.xml中添加以下依赖
- application.yml 添加 eureka注册配置
- 主程序启用服务注册发现客户端
- 启动,并访问 eureka 查看注册信息
- 二.eureka 和 “服务提供者”的高可用
- item-service 高可用
- 配置启动参数
- 启动测试
- 访问两个端口测试
- eureka 高可用
- application-eureka1.yml
- application-eureka2.yml
- 配置启动参数 --spring.profiles.active 和 --server.port
- eureka客户端注册时,向两个服务器注册
- 三.zuul API网关
- 新建 sp11-zuul 项目
- application.yml
- 主程序
- 启动服务,访问测试
- 三.zuul集成Ribbon
- 1.zuul + ribbon 负载均衡
- 2.zuul启用重试(不推荐)
- 1. 添加 spring-retry 依赖
- 2.yml配置 `zuul.retryable=true`
- 3. 配置重试参数(可选)
- 四.zuul 集成 Hystrix
- Hystrix是容错和限流工具
- 1.容错-降级
- 2.添加Hystrix降级
- 1.Zuul默认已经启用Hystrix
- 2.实现FallbackProvider接口,按zuul的规则实现接口的方法
- 3.添加@Comment
- 4.降低 hystrix 超时时间,以便测试降级
- 5.启动服务,测试降级
- 3.Hystrix限流-熔断
- 使用 apache 的并发访问测试工具 ab
- 五.Hystrix dashboard
- 1.Acuator
- 2..搭建Hystrix dashboard
- 1.新建模块: sp07-hystrix-dashboard
- 2.添加依赖:Hystrix dashboard
- 3.yml配置
- 4.启动类添加注解:@EnableHystrixDashBoard
- 5.访问http://localhost:4001/hystrix
- 3.Turbine
- 1.新建模块: sp08-turbine
- 2.添加依赖
- 3. yml
- 4. 启动类注解:`@EnableTurbine`
- 5.访问测试
- 六.VMware
- 虚拟机镜像
- 加载虚拟机
- 网卡不可用
搭建eureka注册中心服务器
- 新建 module: sp05-eureka
- 调整pom.xml
- 父项目
- 添加 eureka server 依赖
- yml
- 关闭自我保护模式
- 主机名
- 针对单台服务器,不向自己注册,不从自己拉取
- 启动类注解:@EnableEurekaServer 触发 eureka 服务器的自动配置
eureka四条运行机制
- 客户端启动时,会反复连接注册中心尝试注册,直到注册成功为止
- 客户端每30秒发送一次心跳数据,服务器连续3次收不到一个服务的心跳,会删除它的注册信息
- 客户端每30秒拉取一次注册表,刷新本地注册表缓存
- 自我保护模式
- 由于网络中断,15分钟内,85%服务器出现心跳异常,自动进入保护模式,
自我保护模式下所有的注册信息都不删除 - 网络恢复后,自动退出保护模式
- 开发调试期间,可以关闭保护模式,避免影响调试
- 由于网络中断,15分钟内,85%服务器出现心跳异常,自动进入保护模式,
客户端连接 eureka 注册中心
修改 2,3,4 项目
-
添加 eureka client 依赖
-
yml
eureka连接地址: http://eureka1:2001/eureka
修改 item-service、user-service、order-service,把微服务注册到 eureka 服务器
1.pom.xml 添加eureka依赖
2.application.yml 添加eureka注册配置
3.主程序启用eureka客户端
4.启动服务,在eureka中查看注册信息
右键点击项目,或点击pom.xml,用 STS 工具编辑起步依赖
application.yml 添加 eureka注册配置org.springframework.cloud spring-cloud-starter-netflix-eureka-client
eureka: client: service-url: defaultZone: http://eureka1:2001/eureka
eureka.instance.lease-renewal-interval-in-seconds
心跳间隔时间,默认 30 秒
defaultZone,默认位置,可以修改为具体地理位置,比如:beiJing, shangHai, shenZhen 等,表示 eureka 服务器的部署位置, 需要云服务器提供
eureka.client.registry-fetch-interval-seconds
拉取注册信息间隔时间,默认 30 秒
主程序启用服务注册发现客户端修改 item-service、user-service 和 order-service,
主程序添加
@EnableDiscoveryClient
注解
启动,并访问 eureka 查看注册信息http://eureka1:2001
源码:
02商品服务
- 右键点击02的启动配置
或者点上面的启动配置下拉菜单
选择 “Edit Configuration” - 对02创建两个启动配置,设置启动参数--server.port=xxxx
启动参数 --server.port 可以覆盖yml中的端口配置
配置启动参数item-service-8001
–server.port=8001
item-service-8002
–server.port=8002
访问 eureka 查看 item-service 注册信息
http://localhost:8001/35
http://localhost:8002/35
添加两个服务器的 profile 配置文件
application-eureka1.ymleureka: instance: hostname: eureka1 client: register-with-eureka: true #profile的配置会覆盖公用配置 fetch-registry: true #profile的配置会覆盖公用配置 service-url: defaultZone: http://eureka2:2002/eureka #eureka1启动时向eureka2注册application-eureka2.yml
eureka: instance: hostname: eureka2 client: register-with-eureka: true #profile的配置会覆盖公用配置 fetch-registry: true #profile的配置会覆盖公用配置 service-url: defaultZone: http://eureka1:2001/eureka #eureka2启动时向eureka1注册配置启动参数 --spring.profiles.active 和 --server.port
eureka1 启动参数:
–spring.profiles.active=eureka1 --server.port=2001
eureka2 启动参数:
–spring.profiles.active=eureka2 --server.port=2002
访问 eureka 服务器,查看注册信息
http://eureka1:2001/
eureka客户端注册时,向两个服务器注册http://eureka2:2002/
修改以下微服务
sp02-itemservice
sp03-userservice
sp04-orderservice
eureka: client: service-url: defaultZone: http://eureka1:2001/eureka, http://eureka2:2002/eureka
当一个 eureka 服务宕机时,仍可以连接另一个 eureka 服务
三.zuul API网关源码: https://github.com/benwang6/spring-cloud-repo 5484
zuul API 网关,为微服务应用提供统一的对外访问接口。
zuul 还提供过滤器,对所有微服务提供统一的请求校验。
- 统一的访问入口
- 统一的权限校验
- 集成 Ribbon 负载均衡和重试
- 集成 Hystrix 容错和限流
统一的访问入口
-
新建模块: sp06-zuul
-
添加依赖:
- eureka client
- zuul
- sp01
-
yml 配置路由转发规则
# **包含深层路径 # * 只包含一层路径 # 服务id设置成访问子路径,是默认规则, # zuul根据注册表的注册信息完成自动配置 # 最好手动配置,防止注册表不全 zuul: routes: item-service: /item-service/** user-service: /user-service/** order-service: /order-service/**
-
启动类添加注解 @EnableZuulProxy
zuul统一权限校验
http://localhost:3001/item-service/t45t4 没有登录不能访问
http://localhost:3001/item-service/t45t4?token=65345rt 已经登录过,可以访问
- 新建 ZuulFilter 子类
- 按 zuul 的规则实现
- 添加 @Component 注解
zuul 的自动配置类可以在 spring 容器中自动发现过滤器实例,完成自动配置
新建 sp11-zuul 项目
pom.xml
需要添加 sp01-commons 依赖
application.ymlspringcloud1 cn.tedu 0.0.1-SNAPSHOT 4.0.0 sp06-zuul0.0.1-SNAPSHOT sp06-zuul Demo project for Spring Boot 1.8 org.springframework.cloud spring-cloud-starter-netflix-eureka-clientorg.springframework.boot spring-boot-starter-testtest org.springframework.cloud spring-cloud-starter-netflix-zuulcn.tedu sp01-commons0.0.1-SNAPSHOT org.springframework.boot spring-boot-maven-plugin
zuul 路由配置可以省略,缺省以服务 id 作为访问路径
spring: application: name: zuul server: port: 3001 eureka: client: service-url: defaultZone: http://eureka1:2001/eureka, http://eureka2:2002/eureka zuul: routes: item-service: /item-service @Override public String getRoute() { return "item-service"; } // 发回給客户端的降级响应数据 @Override public ClientHttpResponse fallbackResponse(String route, Throwable cause) { return new ClientHttpResponse() { @Override public HttpStatus getStatusCode() throws IOException { return null; } @Override public int getRawStatusCode() throws IOException { return HttpStatus.INTERNAL_SERVER_ERROR.value(); } @Override public String getStatusText() throws IOException { return HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase(); } @Override public void close() { //用来关闭下列方法中的流 //BAIS 流内存数据的流,不占用底层系统资源,不需要关闭 } @Override public InputStream getBody() throws IOException { //JsonResult - {code:500,msg:调用商品失败,data:null} String json = JsonResult.err().code(500).msg("调用商品失败").toString(); return new ByteArrayInputStream(json.getBytes("UTF-8")); } @Override public HttpHeaders getHeaders() { HttpHeaders h = new HttpHeaders(); h.add("Content-type", "application/json;charset=UTF-8"); return h; } }; } }
OrderServiceFallback
package cn.tedu.sp06.fb;
import cn.tedu.web.util.JsonResult;
import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Component;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
@Component
public class OrderFB implements FallbackProvider {
@Override
public String getRoute() {
return “order-service”;
}
// 发回給客户端的降级响应数据
@Override
public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
return new ClientHttpResponse() {
@Override
public HttpStatus getStatusCode() throws IOException {
return null;
}
@Override public int getRawStatusCode() throws IOException { return HttpStatus.INTERNAL_SERVER_ERROR.value(); } @Override public String getStatusText() throws IOException { return HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase(); } @Override public void close() { //用来关闭下列方法中的流 //BAIS 流内存数据的流,不占用底层系统资源,不需要关闭 } @Override public InputStream getBody() throws IOException { //JsonResult - {code:500,msg:调用订单失败,data:null} String json = JsonResult.err().code(500).msg("调用订单失败").toString(); return new ByteArrayInputStream(json.getBytes("UTF-8")); } @Override public HttpHeaders getHeaders() { HttpHeaders h = new HttpHeaders(); h.add("Content-type", "application/json;charset=UTF-8"); return h; } }; }
}
3.添加@Comment
spring: application: name: zuul server: port: 3001 eureka: client: service-url: defaultZone: http://eureka1:2001/eureka, http://eureka2:2002/eureka zuul: retryable: true ribbon: ConnectTimeout: 1000 ReadTimeout: 2000 MaxAutoRetriesNextServer: 1 MaxAutoRetries: 1 hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 5005.启动服务,测试降级
添加链接描述
hystrix 对请求的降级和熔断,可以产生监控信息,hystrix dashboard可以实时的进行监控
-
当流量过大,造成后台服务故障,可以断开链路,限制后台服务的访问流量,等待后台服务恢复
-
断路器打开的条件
- 10s 20次请求(必须首先满足)
- 50%出错,执行降级代码
-
半开状态
- 断路器打开一段时间后,会进入半开状态
- 会尝试发送一次客户端调用,
- 成功,关闭断路器
- 失败,继续保持打开状态
添加链接描述
用 ab 工具,以并发50次,来发送20000个请求
ab -n 20000 -c 50 http://localhost:3001/item-service/35
断路器状态为 Open,所有请求会被短路,直接降级执行 fallback 方法
Hystrix数据健康仪表盘
Hystrix日志,是通过Actuator工具来暴露出来
springboot提供的一个项目指标工具,可以通过Actuator获取项目的各种日志数据
- 健康状态
- spring容器中的所有的对象
- spring mvc映射的所有路径
- jvm堆内存镜像
添加Actuator
1.添加actuator,默认添加过了
2.暴露监控日志
m.e.w.e.i = “*” 暴露所有日志
m.e.w.e.i = health 暴露健康状态日志
m.e.w.e.i = health,beans,mapping,hystrix.stream 暴露多种日志
3.查看日志 [添加链接描述](http://localhost:3001/actuator)2…搭建Hystrix dashboard
Hystrix dashboard 仪表盘
3.yml配置springcloud1 cn.tedu 0.0.1-SNAPSHOT 4.0.0 sp07-hystrix-dashboard0.0.1-SNAPSHOT sp07-hystrix-dashboard Demo project for Spring Boot 1.8 org.springframework.boot spring-boot-starterorg.springframework.boot spring-boot-starter-testtest org.springframework.cloud spring-cloud-starter-netflix-hystrix-dashboardorg.springframework.boot spring-boot-maven-plugin
允许抓取的的服务器列表:localhost
server: port: 4001 # - 代表数组或list hystrix: dashboard: proxy-stream-allow-list: - localhost4.启动类添加注解:@EnableHystrixDashBoard
package cn.tedu.sp07; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard; @EnableHystrixDashboard @SpringBootApplication public class Sp07HystrixDashboardApplication { public static void main(String[] args) { SpringApplication.run(Sp07HystrixDashboardApplication.class, args); } }5.访问http://localhost:4001/hystrix
填入 hystrix 的监控端点,开启监控
添加链接描述
聚合多台服务器的日志数据,提供给仪表盘显示
1.新建模块: sp08-turbine
turbine依赖需手动添加
- eureka client
- turbine
3. ymlspringcloud1 cn.tedu 0.0.1-SNAPSHOT 4.0.0 sp08-turbine0.0.1-SNAPSHOT sp08-turbine Demo project for Spring Boot 1.8 Hoxton.SR12 org.springframework.cloud spring-cloud-starter-netflix-eureka-clientorg.springframework.boot spring-boot-starter-testtest org.springframework.cloud spring-cloud-starter-netflix-turbineorg.springframework.boot spring-boot-maven-plugin
聚合的服务: zuul 为聚合的日志数据命名:new String("default")
spring: application: name: turbine # 2001 eureka # 3001 zuul # 4001 hystrix dashboard server: port: 5001 eureka: client: service-url: defaultZone: http://eureka1:2001/eureka,http://eureka2:2002/eureka turbine: app-config: zuul cluster-name-expression: new String("default")4. 启动类注解:@EnableTurbine
package cn.tedu.sp08; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.turbine.EnableTurbine; @EnableTurbine @SpringBootApplication public class Sp08TurbineApplication { public static void main(String[] args) { SpringApplication.run(Sp08TurbineApplication.class, args); } }5.访问测试
8201服务器产生监控数据:
8202服务器产生监控数据:
turbine 监控路径
在 hystrix dashboard 中填入turbine 监控路径,开启监控
turbine聚合了order-service两台服务器的hystrix监控信息
源码:
合并的日志地址: http://localhost:5001/turbine.stream
六.VMware-
VMware 版本: 16+
-
NAT网络网段使用 64 网段
- 编辑 – 虚拟网络编辑器 – 选择 vmnet8 – 左下角修改:192.168.64.0
- 课前资料虚拟机
- centos-7-1908.zip
- centos-8-2105.zip
- 已经做了几步基础设置:
- yum源和扩展源,使用阿里镜像
- 安装了工具: python、pip、ansible
- 方便设置ip地址的脚本:
- ip-static 设置固定ip
- ip-dhcp 自动获取ip
- 解压缩 centos-8-2105.zip
- 双击 centos-8-2105.vmx 加载镜像
- 启动虚拟机,按提示选择“已复制虚拟机”
- 用户名密码都是 root
# centos 7 禁用 NetworkManager 系统服务 systemctl stop NetworkManager systemctl disable NetworkManager # centos 8 开启 VMware 托管 nmcli n on systemctl restart NetworkManager # 还原 VMware 虚拟网络 # VMware 虚拟网络不稳定,经常出现故障 # 编辑 -- 虚拟网络编辑器 -- 左下角按钮“还原默认设置” -- 设置 VMnet8 的 64 网段 # 会删除所有虚拟网络,重新创建
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)