yml配置意义
image.pngimage.png
- 当Ribbon和Eureka配合使用时,会自动将虚拟主机名映射成微服务的网络地址。
- yml中info可以展示一些信息
server:
port: 8000 # 指定端口
spring:
datasource: # 指定数据源
driver-class-name: com.mysql.jdbc.Driver
url: #数据库路径
username: #用户名
password: #密码
logging: # 配置日志级别,让hibernate打印出执行的SQL
level:
root: INFO
## INFO
info: #配置项目信息,有的文章里不带'',不成功的就带上''
app:
name: '@project.artifactId@'
encoding: '@project.build.sourceEncoding@'
java:
source: '@java.version@'
target: '@java.version@'
management:
security:
basic:
enabled: true#true开启基于HTTP basic的认证
user:
name: user
password: password
mybatis:
type-aliases-package: com.itmuck.cloud.study.entity #mybatis别名配置
Eureka
Eureka架构图Application Service 相当于本书中的服务提供者,Application Client相当于本书中的服务消费者;
Region和Zone
Make Remote Call,可以简单理解为调用RESTful API;
us-east-1c、us-east-1d等都是zone,它们都属于us-east-1这个region;来源
- Eureka Client是一个Java客户端,用于简化与Eureka Server的交互;
- Eureka Server提供服务发现的能力,各个微服务启动时,会通过Eureka Client向Eureka Server进行注册自己的信息(例如网络信息),Eureka Server会存储该服务的信息;
- 微服务启动后,会周期性地向Eureka Server发送心跳(默认周期为30秒)以续约自己的信息。如果Eureka Server在一定时间内没有接收到某个微服务节点的心跳,Eureka Server将会注销该微服务节点(默认90秒);
- 每个Eureka Server同时也是Eureka Client,多个Eureka Server之间通过复制的方式完成服务注册表的同步;
Eureka Client会缓存Eureka Server中的信息。即使所有的Eureka Server节点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者。
Eureka集群
为保证高可用,部署Eureka集群,yml配置文件可配置如下:
eureka:
client:
serviceUrl:
defaultZone: http://peer2:8762/eureka/,http://peer1:8761/eureka/
---
spring:
profiles: peer1
server:
port: 8761
eureka:
instance:
hostname: peer1
---
spring:
profiles: peer2
server:
port: 8762
eureka:
instance:
hostname: peer2
启动Eureka集群的命令
将应用注册到集群上,就是要改defaultZone,用逗号分隔即可,例如:
eureka:
client:
serviceUrl:
defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/
注册到需要认证的Eureka Server:defaultZone修改为:http://{user}:{password}@EUREKA_HOST:PORT/eureka/
Eureka自我保护模式
image.pngRibbon
可以通过Java @Configuration和指定@RibbonClient来配置负载均衡策略,也可以通过yml
负载均衡项目名.ribbon.NFLoadBalancerRuleClassName来指定
Feign-声明式REST调用
为了解决上述使用RestTemplate调用参数过长难以维护的问题,关于RestTemplate,请参考RestTemplate。
整合Feign
- 创建FeignClient
@FeignClient(name = "microservice-provider-user")
public interface UserFeignClient {
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public User findById(@PathVariable("id") Long id);
}
- 启动类添加@EnableFeignClients
- 修改Controller调用方式
@RestController
public class MovieController {
@Autowired
private UserFeignClient userFeignClient;
@GetMapping("/user/{id}")
public User findById(@PathVariable Long id) {
return this.userFeignClient.findById(id);
}
}
实现REST调用的同时还实现了客户端侧的负载均衡
支持压缩
feign.compression.request.enabled=true
feign.compression.response.enabled=true
其他详细配置自己搜索
Feign日志
只对DEBUG级别做出响应。
logging:
level:
com.itmuch.cloud.study.user.feign.UserFeignClient: DEBUG # 将Feign接口的日志级别设置成DEBUG,因为Feign的Logger.Level只对DEBUG作出响应。
使用Feign构造多参数请求
POST:按照SpringMVC POST+JSON请求方式书写即可。
GET:用Map接收或者按照普通的SpringMVC多参数接收方式即可。
个人标注:使用Feign解决了使用RestTemplate时的硬编码问题,根据服务名称自动发现服务,实现调用。而RestTemplate则比起HTTPClient调用服务要更为简单方便一些。
Hystrix 豪猪——容错处理
依赖的服务不可用时,服务本身会不会被拖垮?这是我们要考虑的问题。
实现容错的手段
雪崩效应
“基础服务故障”导致“级联故障”的现象称为雪崩效应。
如何容错
需要实现以下两点:
- 为网络请求设置超时。(这一点同JCIP《并发编程实战》中在指定时间内获取对应的返回数据一例大概符合)
- 使用断路器模式
断路器实现Fast-Fail,如果服务已经不可用,则强迫对该服务的调用快速失败。同时,可以自动诊断依赖的服务是否恢复正常。
注意:断路器打开一段时间后,会自动进入“半开”状态。允许一个请求访问依赖的服务,如果请求调用成功,关闭断路器,否则继续保持打开状态。
个人标注:断路器主要是为了提升可用性,房子雪崩效应。这一点类似集群,对应分布式中CAP(一致性,可用性,分区)中的A(availability)
使用Hystrix实现容错
简介
Hystrix是一个实现了超时机制和断路器模式的工具类库,防止级联失败,提升系统可用性和容错性。
通过一下几点实现延迟和容错:
- 包裹请求
- 跳闸机制
- 资源隔离:为每个依赖都维护了一个小型的线程池(或者信号量Semaphore)(PS:这一点可能跟Executor那几种静态ExecutorService方法有相似之处,现在还没看过,暂且猜测一下)
- 监控
- 回退机制
- 自我修复
整合Hystrix
启动类添加注解@EnableCircuitBreaker或@EnableHystrix
Controller里面在方法上写@HystrixCommand,指定属性fallbackMethod,指定回退方法;还可以配置利用@HystrixCoProperty commandProperties
执行回退逻辑,并不一定代表断路器处于打开状态。请求失败、超市、被拒绝以及断路器打开时都会执行回退逻辑。
失败率达到20次失败/5s这个阈值才会打开。
线程隔离策略与传播上下文
隔离策略有两种:
- 线程隔离:HystrixCommand会在单独的线程上执行,并发请求受线程池中的线程数量的限制
- 信号量隔离:HystrixCommand将会在调用线程上执行,开销相对较小,并发请求受到信号量个数的限制
可使用execution.isolation.strategy属性指定隔离策略。默认是Thread隔离策略。
Feign整合Hystrix
如下:
package com.itmuch.cloud.study.user.feign;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.itmuch.cloud.study.user.entity.User;
/**
* Feign的fallback测试
* 使用@FeignClient的fallback属性指定回退类
* @author 周立
*/
@FeignClient(name = "microservice-provider-user", fallback = FeignClientFallback.class)
public interface UserFeignClient {
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public User findById(@PathVariable("id") Long id);
}
/**
* 回退类FeignClientFallback需实现Feign Client接口
* FeignClientFallback也可以是public class,没有区别
* @author 周立
*/
@Component
class FeignClientFallback implements UserFeignClient {
@Override
public User findById(Long id) {
User user = new User();
user.setId(-1L);
user.setUsername("默认用户");
return user;
}
}
结合FallbackFactory重写create()方法打印失败原因。
为Feign禁用Hystrix:
配置@Configuration,在FeignClient引用该配置类即可。
全局禁用:yml文件配置feign.hystrix.enabled=false
Hystrix的监控
一般项目:引入Hystrix-metrics-event-stream,访问ip:port/hystrix.stream即可
Feign项目:引入spring-cloud-starter-hystrix依赖,启动类加上@EnableCircuitBreaker,访问/hystrix.stream监控Hystrix
使用Hystrix Dashboard可视化监控数据
添加hystrix-dashboard依赖,启动类添加@EnableHystrixDashboard
监控的是单个微服务。
使用Turbine聚合监控数据
使用消息中间件收集数据
使用Zuul构建微服务网关
电影买票,可能会调用多个微服务的接口(例如库存微服务、用户微服务、支付微服务等),才能完成一次购票的业务流程。客户端直接和各个微服务通信可能存在一些问题:
- 客户端多次请求不同微服务,增加了客户端的复杂性
- 存在跨域请求,在一定场景下处理相对复杂
- 认证复杂,每个微服务都需要独立认证
- 难以重构
- 直接访问可能会有一定困难
以上问题可借助微服务网关解决。
使用微服务网关优点: - 易于监控
- 易于认证
- 减少客户端与各个微服务直接的交互次数。
Zuul简介
其核心是一系列的过滤器。
Zuul的路由端点
路由配置
Zuul安全与Header
Zuul文件上传
小文件上传(1M以内),无需任何处理,即可正常上传。对于大文件(10M以上)上传,需要为上传路径添加/zuul前缀
Zuul的过滤器
Zuul中定义了4种标准过滤器类型:
- PRE
- ROUTING
- POST
- ERROR
编写过滤器,继承ZuulFilter覆写方法,启动类添加filter对应的@Bean即可
禁用Zuul过滤器
zuul.<SimpleClassName>.<filterType>.disable=true
Zuul的容错与回退
实现ZuulFallbackProvider接口
Zuul的高可用
分两种情况:Zuul客户端注册和未注册到Eureka Server上
使用Sidecar整合非JVM微服务
非JVM微服务需要实现监控检查,status状态常见取值有:UP/DOWN/OUT_OF_SERVICE/UNKNOWN等。
Spring Cloud Config
维护的配置管护理一般有以下需求:
- 集中管理配置。
- 不同环境不同配置。
- 运行期间可动态调整。
- 配置修改后可自动更新。
简介
Config为分布式系统外部化配置提供了服务器端和客户端的支持,它包括Config Server和Config Client两部分。默认使用Git存储配置内容。
启动类@EnableConfigServer
Actuator提供的/refresh可以实现手动刷新配置,在Controller上添加注解@RefreshScope
使用Spring Cloud Bus自动刷新配置
使用Spring Cloud Sleuth实现微服务跟踪
使用Actuator监控微服务实例,使用Hystrix监控Hystrix Command,使用Sleuth实现微服务“跟踪”
分布式计算的八大误区:
- 网络可靠
- 延迟为零
- 带宽无限
- 网络绝对安全
- 网络拓扑不会改变
- 必须有一名管理员
- 传输成本为零
- 网络同质化
基本在描述同一个问题——网络问题。微服务之间通过网络进行通信,如果跟踪请求可以了解经过哪些微服务、请求耗时、网络延迟等指标,就可以更好的分析系统瓶颈。
简介
一些术语:
- span(跨度):基本工作单元。用一个64位的id唯一标识。
- trace(跟踪):一组共享“root span”的span组成的树状结构成为trace。
- annotation(标注):annotation用来记录事件的存在。其中,核心annotation用来定义请求的开始和结束。
- CS(client Sent客户端发送)
- SR(Server Received服务器端接收)
- SS(Server Send服务器端发送)
- CR(client Received客户端接收)
Spring Cloud Sleuth与ELK配合使用
与Zipkin配合使用
编写Zipkin Server:添加以来,启动类使用@EnableZipkinServer注解
可以查看详细信息,还可以分析微服务之间的依赖。
image.png
Docker
Docker是一个开源的容器引擎,它有助于更快的交付应用。好处:可更快的打包、测试以及部署应用程序,并可以缩短从编写到部署运行代码的周期。
注解
@EnableDiscoveryClient:声明这是一个Eureka的Client,在启动类上加
@SpringBootApplication:启动类注解
Feign注解:
@RequestLine("GET /{id}")
public User findById(@Param("id") Long id);
Actuator
提供了很多监控端点,可使用http://{ip}:{port}/{endpoint}的形式访问这些端点。
image.png
其他小知识
- RestTemplate可以请求微服务,例如:restTemplate对象.getForObject(地址,类.class)
- 服务发现组件:Eureka,Zookeeper,Consul
- 启动同一个微服务的多个实例:
- 打包
- java -jar jar包名 --server.port=8001更改port启动即可
- 负载均衡器:Nginx、HAProxy、F5等
- JCE(Java Cryptography Extension)
看完这本书后,可以了解一下拜托!面试请不要再问我Spring Cloud底层原理
网友评论