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

  1. 创建FeignClient
@FeignClient(name = "microservice-provider-user")
public interface UserFeignClient {
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public User findById(@PathVariable("id") Long id);
}
  1. 启动类添加@EnableFeignClients
  2. 修改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这个阈值才会打开。

线程隔离策略与传播上下文

隔离策略有两种:

  1. 线程隔离:HystrixCommand会在单独的线程上执行,并发请求受线程池中的线程数量的限制
  2. 信号量隔离: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
  • 启动同一个微服务的多个实例:
  1. 打包
  2. java -jar jar包名 --server.port=8001更改port启动即可
  • 负载均衡器:Nginx、HAProxy、F5等
  • JCE(Java Cryptography Extension)

看完这本书后,可以了解一下拜托!面试请不要再问我Spring Cloud底层原理

《SpringCloud docker》读书笔记的更多相关文章

  1. csapp读书笔记-并发编程

    这是基础,理解不能有偏差 如果线程/进程的逻辑控制流在时间上重叠,那么就是并发的.我们可以将并发看成是一种os内核用来运行多个应用程序的实例,但是并发不仅在内核,在应用程序中的角色也很重要. 在应用级 ...

  2. CSAPP 读书笔记 - 2.31练习题

    根据等式(2-14) 假如w = 4 数值范围在-8 ~ 7之间 2^w = 16 x = 5, y = 4的情况下面 x + y = 9 >=2 ^(w-1)  属于第一种情况 sum = x ...

  3. CSAPP读书笔记--第八章 异常控制流

    第八章 异常控制流 2017-11-14 概述 控制转移序列叫做控制流.目前为止,我们学过两种改变控制流的方式: 1)跳转和分支: 2)调用和返回. 但是上面的方法只能控制程序本身,发生以下系统状态的 ...

  4. CSAPP 并发编程读书笔记

    CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 ...

  5. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

  6. 读书笔记--SQL必知必会18--视图

    读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...

  7. 《C#本质论》读书笔记(18)多线程处理

    .NET Framework 4.0 看(本质论第3版) .NET Framework 4.5 看(本质论第4版) .NET 4.0为多线程引入了两组新API:TPL(Task Parallel Li ...

  8. C#温故知新:《C#图解教程》读书笔记系列

    一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...

  9. C#刨根究底:《你必须知道的.NET》读书笔记系列

    一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...

  10. Web高级征程:《大型网站技术架构》读书笔记系列

    一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...

随机推荐

  1. Python基础-组织列表

    1.字符串的几个常用方法 name = ''adb lovelace '' name.title() 首字母大写 name.upper() 全部大写 name.lower() 全部小写 2.组织列表操 ...

  2. 微服务-springboot-rabbitmq:实现延时队列

    延时队列应用于什么场景 延时队列顾名思义,即放置在该队列里面的消息是不需要立即消费的,而是等待一段时间之后取出消费.那么,为什么需要延迟消费呢?我们来看以下的场景 网上商城下订单后30分钟后没有完成支 ...

  3. Spring Boot2(十一):Mybatis使用总结(自增长、多条件、批量操作、多表查询等等)

    一.前言 上次用Mybatis还是2017年做项目的时候,已经很久过去了.中途再没有用过Mybatis.导致现在学习SpringBoot过程中遇到一些Mybatis的问题,以此做出总结(XML极简模式 ...

  4. Java 源码学习系列(三)——Integer

    Integer 类在对象中包装了一个基本类型 int 的值.Integer 类型的对象包含一个 int 类型的字段. 此外,该类提供了多个方法,能在 int 类型和 String 类型之间互相转换,还 ...

  5. 基础篇-1.1走进Java世界

    在走进Java世界之前,我们势必先了解下Java是什么?Java是一门面向对象的编程语言,是静态面向对象编程语言的代表,极好得实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程.Java具有 ...

  6. 【题解】跳房子-C++

    Description奶牛按不太传统的方式玩起小朋友玩的跳房子游戏,现给出一个5*%的由数字组成的网格.它们在格子中向前前跳,向后跳,向左跳,向右跳,跳到网格中另一个数字后,又这样继续跳(可能跳到某个 ...

  7. Python常用的标准库以及第三方库

    Python常用的标准库以及第三方库有哪些?   20个必不可少的Python库也是基本的第三方库 读者您好.今天我将介绍20个属于我常用工具的Python库,我相信你看完之后也会觉得离不开它们.他们 ...

  8. Keil debug command SAVE 命令保存文件的解析

    简介 使用 Keil debug 很方便,把内存中的一段区域 dump 出来也很方便,例如使用命令 SAVE filepath startAddr, endAddr, typeCode .但是要查看 ...

  9. 《VR入门系列教程》之13---相机与立体渲染

    相机.透视图.视口.投影     渲染好的场景都需要一个可以供用户查看的视图,我们通常在3D场景中用相机来提供这种需求.相机相对场景有位置和方向,就像我们生活中的相机一样,它也提供透视图查看方式,这种 ...

  10. JS面向对象编程(一):封装

    js是一门基于面向对象编程的语言.      如果我们要把(属性)和(方法)封装成一个对象,甚至要从原型对象生成一个实例,我们应该怎么做呢?  一.生成对象的原始模式            假定把猫看 ...