《SpringCloud docker》读书笔记
yml配置意义
- 当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
Application Service 相当于本书中的服务提供者,Application Client相当于本书中的服务消费者;
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
将应用注册到集群上,就是要改defaultZone,用逗号分隔即可,例如:
eureka:
client:
serviceUrl:
defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/
注册到需要认证的Eureka Server:defaultZone修改为:http://{user}:{password}@EUREKA_HOST:PORT/eureka/
Eureka自我保护模式
Ribbon
可以通过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...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注解
可以查看详细信息,还可以分析微服务之间的依赖。
Docker
Docker是一个开源的容器引擎,它有助于更快的交付应用。好处:可更快的打包、测试以及部署应用程序,并可以缩短从编写到部署运行代码的周期。
注解
@EnableDiscoveryClient:声明这是一个Eureka的Client,在启动类上加
@SpringBootApplication:启动类注解
Feign注解:
@RequestLine("GET /{id}")
public User findById(@Param("id") Long id);
Actuator
提供了很多监控端点,可使用http://{ip}:{port}/{endpoint}的形式访问这些端点。
其他小知识
- RestTemplate可以请求微服务,例如:restTemplate对象.getForObject(地址,类.class)
- 服务发现组件:Eureka,Zookeeper,Consul
- 启动同一个微服务的多个实例:
- 打包
- java -jar jar包名 --server.port=8001更改port启动即可
- 负载均衡器:Nginx、HAProxy、F5等
- JCE(Java Cryptography Extension)
看完这本书后,可以了解一下拜托!面试请不要再问我Spring Cloud底层原理
《SpringCloud docker》读书笔记的更多相关文章
- csapp读书笔记-并发编程
这是基础,理解不能有偏差 如果线程/进程的逻辑控制流在时间上重叠,那么就是并发的.我们可以将并发看成是一种os内核用来运行多个应用程序的实例,但是并发不仅在内核,在应用程序中的角色也很重要. 在应用级 ...
- CSAPP 读书笔记 - 2.31练习题
根据等式(2-14) 假如w = 4 数值范围在-8 ~ 7之间 2^w = 16 x = 5, y = 4的情况下面 x + y = 9 >=2 ^(w-1) 属于第一种情况 sum = x ...
- CSAPP读书笔记--第八章 异常控制流
第八章 异常控制流 2017-11-14 概述 控制转移序列叫做控制流.目前为止,我们学过两种改变控制流的方式: 1)跳转和分支: 2)调用和返回. 但是上面的方法只能控制程序本身,发生以下系统状态的 ...
- CSAPP 并发编程读书笔记
CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 ...
- 读书笔记汇总 - SQL必知必会(第4版)
本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...
- 读书笔记--SQL必知必会18--视图
读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...
- 《C#本质论》读书笔记(18)多线程处理
.NET Framework 4.0 看(本质论第3版) .NET Framework 4.5 看(本质论第4版) .NET 4.0为多线程引入了两组新API:TPL(Task Parallel Li ...
- C#温故知新:《C#图解教程》读书笔记系列
一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...
- C#刨根究底:《你必须知道的.NET》读书笔记系列
一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...
- Web高级征程:《大型网站技术架构》读书笔记系列
一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...
随机推荐
- Python基础-组织列表
1.字符串的几个常用方法 name = ''adb lovelace '' name.title() 首字母大写 name.upper() 全部大写 name.lower() 全部小写 2.组织列表操 ...
- 微服务-springboot-rabbitmq:实现延时队列
延时队列应用于什么场景 延时队列顾名思义,即放置在该队列里面的消息是不需要立即消费的,而是等待一段时间之后取出消费.那么,为什么需要延迟消费呢?我们来看以下的场景 网上商城下订单后30分钟后没有完成支 ...
- Spring Boot2(十一):Mybatis使用总结(自增长、多条件、批量操作、多表查询等等)
一.前言 上次用Mybatis还是2017年做项目的时候,已经很久过去了.中途再没有用过Mybatis.导致现在学习SpringBoot过程中遇到一些Mybatis的问题,以此做出总结(XML极简模式 ...
- Java 源码学习系列(三)——Integer
Integer 类在对象中包装了一个基本类型 int 的值.Integer 类型的对象包含一个 int 类型的字段. 此外,该类提供了多个方法,能在 int 类型和 String 类型之间互相转换,还 ...
- 基础篇-1.1走进Java世界
在走进Java世界之前,我们势必先了解下Java是什么?Java是一门面向对象的编程语言,是静态面向对象编程语言的代表,极好得实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程.Java具有 ...
- 【题解】跳房子-C++
Description奶牛按不太传统的方式玩起小朋友玩的跳房子游戏,现给出一个5*%的由数字组成的网格.它们在格子中向前前跳,向后跳,向左跳,向右跳,跳到网格中另一个数字后,又这样继续跳(可能跳到某个 ...
- Python常用的标准库以及第三方库
Python常用的标准库以及第三方库有哪些? 20个必不可少的Python库也是基本的第三方库 读者您好.今天我将介绍20个属于我常用工具的Python库,我相信你看完之后也会觉得离不开它们.他们 ...
- Keil debug command SAVE 命令保存文件的解析
简介 使用 Keil debug 很方便,把内存中的一段区域 dump 出来也很方便,例如使用命令 SAVE filepath startAddr, endAddr, typeCode .但是要查看 ...
- 《VR入门系列教程》之13---相机与立体渲染
相机.透视图.视口.投影 渲染好的场景都需要一个可以供用户查看的视图,我们通常在3D场景中用相机来提供这种需求.相机相对场景有位置和方向,就像我们生活中的相机一样,它也提供透视图查看方式,这种 ...
- JS面向对象编程(一):封装
js是一门基于面向对象编程的语言. 如果我们要把(属性)和(方法)封装成一个对象,甚至要从原型对象生成一个实例,我们应该怎么做呢? 一.生成对象的原始模式 假定把猫看 ...