【总结】springcloud
一.spirngcloud概述
1.springcloud是什么?
spring cloud是一个一站式的开发分布式系统的框架,为开发人员提供了快速构建分布式系统中一些常见模式的工具(如:配置管理,服务发现,断路器,智能路由,微代理等)
2.springcloud版本
springcloud版本 | springboot版本 |
---|---|
Finchley | 2.0.X |
Edgware | 1.5.X |
Daslton | 1.5.X |
Camden | 1.4.X |
Brixton | 1.3.X |
Angel | 1.2.X |
二.eureka注册中心搭建(服务端)
1.服务注册中心Eureka
(1)Eureka是一个服务治理组件,主要包括服务注册和服务发现,主要用来搭建服务注册中心。是springcloud对netflix Eureka的二次封装
(2)采用c/s设计架构,分客户端和服务端。服务端是注册中心,而系统中其它微服务使用客户端连接到服务端,并保持心跳连接
2.eureka注册中心搭建-单点模式
(1)引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RC2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
(2)入口类加@EnableEurekaServer注解,开启Eureka注册中心服务端
(3)在application.properties中配置
#端口
server-port=8761
#设置注册中心的hostname
eureka.instance.hostname=localhost
#禁止自己向自己注册
eureka.client.register-with-eureka=false
#不去检索其它服务,因为本身职责就是维护服务实例
eureka.client.fetch-register=false
#指定服务注册中心位置
eureka.client.service-url.defaultZone=http://localhost:8080/eureka/
3.eureka注册中心搭建-集群模式
7002,7003同理,相互注册
server:
port: 7001
eureka:
instance:
hostname: eureka1 #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
# euraka集群
defaultZone: http://eureka2:7002/eureka/,http://eureka3:7003/eureka
三.eureka客户端搭建
(1)eureka客户端依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-client</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RC2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
(2)@EnableEurekaClient
表明自己是一个eureka客户端,让服务提供者可以连接eureka注册中心
(3)配置服务名和注册中心地址
server.port=9100
spring.application.name=provider1
eureka.client.service-url.defaultZone=http://localhost:8080/eureka/
四.服务发现与消费
服务发现(发现注册中心的服务)由eureka客户端实现,服务消费由Feign实现
Fegin是nexflix公司开发的声明式Rest调用客户端。feign还整合了Ribbon和hystrix两个组件
1.引入feign依赖
2.启动类加注解
@EnableFeignClients
3.声明服务
service包下定义一个接口,通过@FeignClient指定服务提供者名字
//括号里是远程服务名
@FeignClient("helloApplication")
public interface HelloService{
//远程方法
@RequestMapping("/service/hello")
public String hello();
}
4.调用服务
controller包下
@RestController
public class FeignController{
@Autowired
private helloService HelloService;
@Requestmapping("/web/hello")
public String hello(){
return helloService.hello()
}
}
五.Eureka注册中心自我保护机制
在没有Eureka自我保护的情况下,如果Eureka Server在一定时间内(默认90s)没有接收到某个微服务实例的心跳,Eureka server将会注销该实例。但有时候仅仅是因为网络故障,直接注销就会很危险,因为微服务本身是正常的。所以在15分钟内,心跳失败率低于85%,就会触发自我保护机制,开启自我保护,只会在注册中心页面弹出红色的警告信息,eureka保留该服务。
1.关闭自我保护机制(服务器端)
#关闭自我保护机制
eureka.server.enable-self-preservation = false
2.自我保护机制下的某个服务,消费者还可以调取吗?
如果这个服务时真的故障了,那只是注册中心的服务地址列表里还保留了这个地址,当消费者拿到这个地址去调用的时候,还是调用不到的
3.注册中心挂掉,消费者还可以调用吗?
如果消费者已从注册中心拿到了这个服务地址列表,则可以调用
六.负载均衡(ribbon)
1.ribbon是什么?
Ribon是基于HTTP和TCP的客户端负载均衡器。在eureka客户端服务发现的基础上,实现对服务实例的选择策略,从而实现对服务的负载均衡消费
2.搭建服务消费者调用服务
(1)启动多个相同服务提供者(8060 8061 8062)
(2)消费者使用feign进行调用
3.负载均衡策略
策略 | 命名 | 描述 |
---|---|---|
RandomRule | 随机策略 | 随机选择server |
RoundRobinRule | 轮询策略 | 按照顺序选择server(ribbon默认策略) |
AvailabilityFilteringRule | 可用过滤策略 | 过滤掉不可用的和高并发的 |
ResponseTimeWeightedRule | 响应时间加权重策略 | 根据server的响应时间分配权重,响应时间越长,权重越低,被选择到的概率也就越低。 |
4.配置:
(1)方式1:
@Configuration
public class RibbonConfiguration {
@Bean
public IRule ribbonRule() {
return new RandomRule();
}
}
(2)方式2:
client-a:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #针对client-a服务使用随机策略
七.服务熔断Hystrix
断路器
“断路器”是一种开关装置,当某个服务发生故障监控(类似熔断保险丝),向调用方法返回一个备选的响应,而不是长时间的等待或者抛出调用方法无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
熔断模式
在对某个服务调用不可用达到一个阈值,5秒内20次调用失败就会就会启动熔断模式。熔断器的开关是由服务的健康状况(服务的健康状况 = 请求失败数 / 请求总数)决定的。当断路器开关关闭时请求可以通过,一但服务器健康状况低于设定阈值断路器就会打开,请求会被禁止通过。当断路器处于打开状态时,一段时间后会进入半开状态,这时只允许一个请求通过,如果该请求成功熔断器恢复到关闭状态,如果调用失败断路器继续保持打开
服务降级
服务降级,一般是从整体符合考虑,就是当某个服务熔断之后,服务器将不再被调用,此刻客户端可以自己准备一个本地的fallback回调,返回一个缺省值
1.快速入门
(1)导入依赖spring-cloud-starter-hystrix
(2)消费启动类开启@EnableCircuitBreaker
(3)消费者配置yml文件feign.hystrix.enabled=true
(4)实现feiginclient接口
@Component
public class TestClient1FallBack implements TestClient1 {
@Override
public String get(String id) {
return "feign hystrix fallback for get method";
}
}
(5)@FeignClient注解配置fallback参数
@FeignClient(name="cleint-product", fallback = TestClient1FallBack.class)
public interface TestClient1 {
@getmapping("/getProduct")
public String get(String id) {}
}
八.配置中心 config
在SpringCloud中我们使用config组件来作为统一配置中心
1.搭建配置中心
(1)添加依赖
(2)配置文件 配置git信息
spring.cloud.config.server.git.uri = https://github.com/xuwujing/springcloud-study/
#git仓库下的相对地址
spring.cloud.config.server.git.search-paths = springcloud-config/config-repo
#拉取到本地的地址
basedir: D:/config/basedir
spring.cloud.config.server.git.username =
spring.cloud.config.server.git.password =
(3)入口类添加@EnableConfigServer
2.配置中心访问方式
当文件命名遵循{application}-{profile}.properties ,可通过/{application}/{profile}访问
3.配置中心的调用
(1)加入config客户端依赖
(2)创建bootstrap.yml文件,它会优先于application.yml加载
spring:
cloud:
config:
uri: http://127.1.1.1:9988 #配置中心地址
name: conf #对应的application部分
profile: dev # 指定配置文件的环境
label: master #git的分支
4.springcloud config更新机制
git仓库文件发生改变。config客户端并不能直接感知(只有服务重启才可以感知)springcloud已经给我们提供了解决方案,每个客户端通过POST方法触发各自的/refresh
(1)添加依赖actuator
spring-boot-starter-actuator是一套监控的功能,可以监控程序在运行时状态,其中就包括/refresh的功能
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
(2)配置文件
#自动刷新配置 默认 health,info
management.endpoints.web.exposure.include=refresh
(3)访问/actuator/refresh(手动)
调用接口:http:127.0.0.1:1281/actuator/refresh
(想要自动访问可以使用webhook,push的时候自动访问接口)
5.config注册中心高可用
做集群,需要把config server也注册为服务,这样客户端就能以服务的形式进行访问。通过这种方法,启动多个指向同一git的config-server就能实现了
服务端改造:
(1)添加eureka客户端依赖
(2)配置文件增加以下内容,向eureka-server注册
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8866/eureka/
(3)配置完全相同,改一下端口,启动3个
客户端改造
(1)bootstrap.yml在上面的基础上再增加:
spring:
cloud:
config:
discovery:
enable: true #开启config服务发现支持
service-id: config-server #config服务端的服务名称
eureka:
client:
serviceUrl:
defaultZone:http://127.0.0.1:8866/eureka/
九.API网关zuul
zuul是spring cloud中的微服务API网关。所有请求都会通过zuul到达指定服务。实现了认证和安全(验证只需要在网关,不需要在每个微服务),动态路由(这样前端请求网关就可以,避免服务路径改变对前端请求的影响)
1.zuul构建API网关
(1)添加zuul依赖
(2)在入口类添加@EnableZuulProxy注解
(3)配置文件配置注册中心
(4)访问zuul的id+端口+服务名称/方法
如果想改变路由规则,配置文件:
zuul.routes.springcloud-service=/abc/**
①如果什么规则都不写,就会有一套默认规则((4)中的格式)
②如果有某个规则不想被外部路由
zuul.ignored-services=service-provider
2.zuul 过滤器
Zuul大部分功能都是通过过滤器来实现的,Zuul定义了4种标准的过滤器类型,这些过滤器类型对应于请求的典型生命周期。
a、pre: 这种过滤器在请求被路由之前调用。可利用这种过滤器实现身份验证
b、routing: 这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求
c、post: 这种过滤器在路由到微服务以后执行。这种过滤器可用收集统计信息和指标等
d、error: 在其他阶段发送错误时执行该过滤器
public class DebugFilter extends ZuulFilter {
//声明过滤器类型
@Override
public String filterType() {
return PRE_TYPE;
}
//过滤器执行顺序,数字越小,优先级越高
@Override
public int filterOrder() {
return 0;
}
//该过滤器是否被执行
@Override
public boolean shouldFilter() {
HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
if ("true".equals(request.getParameter(DEBUG_PARAMETER.get()))) {
return true;
}
return ROUTING_DEBUG.get();
}
//过滤逻辑
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
ctx.setDebugRouting(true);
ctx.setDebugRequest(true);
return null;
}
}
十.sleuth 链路跟踪
调用一个服务,这个服务可能再请求其它服务,这样形成一条调用链,我们需要分析异常,就需要了解这条调用链。通过spring cloud-sleuth就能发现。可以结合ZipKin,利用ZipKin UI来展示数据
1.安装zipkin服务端
2.zipkin客户端(也就是被监控的服务)
(1)在需要跟踪的服务加zipkin和sleuth依赖
(2)配置文件
spring:
sleuth:
web:
client:
enable:true
zipkin:
base-url:http://127.0.0.1:9411/ #zipkin服务端地址
【总结】springcloud的更多相关文章
- 【微框架】之一:从零开始,轻松搞定SpringCloud微框架系列--开山篇(spring boot 小demo)
Spring顶级框架有众多,那么接下的篇幅,我将重点讲解SpringCloud微框架的实现 Spring 顶级项目,包含众多,我们重点学习一下,SpringCloud项目以及SpringBoot项目 ...
- springcloud(第三篇)springcloud eureka 服务注册与发现 *****
http://blog.csdn.net/liaokailin/article/details/51314001 ******************************************* ...
- SpringCloud Sleuth 使用
1. 介绍 Spring-Cloud-Sleuth是Spring Cloud的组成部分之一,为SpringCloud应用实现了一种分布式追踪解决方案,其兼容了Zipkin, HTrace和log- ...
- SpringCloud+Consul 服务注册与服务发现
SpringCloud+Consul 服务注册与服务发现 1. 服务注册: 在Spring.factories有一段: # Discovery Client Configuration org.spr ...
- SpringCloud学习后获取的地址
关于SpringCloud + Docker 学习地址: (1) https://yq.aliyun.com/articles/57265 (2) https://yq.aliyun.com/team ...
- SpringCloud网关ZUUL集成consul
最近一直在搞基于springcloud的微服务开发,为了不限定微服务开发语言,服务发现决定采用consul不多说上代码 pom文件 <project xmlns="http://mav ...
- springcloud(一):大话Spring Cloud
研究了一段时间spring boot了准备向spirng cloud进发,公司架构和项目也全面拥抱了Spring Cloud.在使用了一段时间后发现Spring Cloud从技术架构上降低了对大型系统 ...
- springcloud(二):注册中心Eureka
Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现.也是springcloud体系中最重要最核心的组 ...
- springcloud(四):熔断器Hystrix
说起springcloud熔断让我想起了去年股市中的熔断,多次痛的领悟,随意实施的熔断对整个系统的影响是灾难性的,好了接下来我们还是说正事. 熔断器 雪崩效应 在微服务架构中通常会有多个服务层调用,基 ...
- springcloud(六):配置中心(一)
随着线上项目变的日益庞大,每个项目都散落着各种配置文件,如果采用分布式的开发模式,需要的配置文件随着服务增加而不断增多.某一个基础服务信息变更,都会引起一系列的更新和重启,运维苦不堪言也容易出错.配置 ...
随机推荐
- 从四个问题透析Linux下C++编译&链接
摘要:编译&链接对C&C++程序员既熟悉又陌生,熟悉在于每份代码都要经历编译&链接过程,陌生在于大部分人并不会刻意关注编译&链接的原理.本文通过开发过程中碰到的四个典型 ...
- 推荐一款轻量小众却高效免费开源windows热键脚本语言Autohotkey
写在前面的话 Autohotkey是一款轻量小众但高效免费开源的windows热键脚本语言,游戏操纵.鼠标操作.键盘快捷重定义,快捷短语等等,只有你想不到,没有它做不到,神器中的神器呀,相见恨晚. 安 ...
- 小白也能看懂的ArrayList的扩容机制
来,话不多说进入正题!我们下面用最简单的代码创建ArrayList并添加11个元素,并 一 一 讲解底层源码:在说之前,给大家先普及一些小知识: >ArrayList底层是用数组来实现的 > ...
- obj2opengl:转换OBJ 3D模型到iPhone OpenGL ES兼容的数组中
原文如下:obj2opengl: convert obj 3D models to arrays compatible with iPhone OpenGL ES obj2opengl在GitHub中 ...
- 01 AS 首次编译执行项目过程中遇到的几个常见问题
问题01 as打开时出现The environment variable JAVA_HOME (with The value of C:\Java\jdk1.8.0_101\bin) does not ...
- 06 C语言变量
C语言变量 变量的本质 变量的本质其实是程序可操作的存储区的名称. C 中每个变量都有特定的类型,类型决定了变量存储的大小的范围,在范围内的值都可以存储在内存中,运算符可应用于变量上. 变量的名称可以 ...
- Metasploit简单使用——后渗透阶段
在上文中我们复现了永恒之蓝漏洞,这里我们学习一下利用msf简单的后渗透阶段的知识/ 一.meterperter常用命令 sysinfo #查看目标主机系统信息 run scraper #查看目标主机详 ...
- ✅Vue选择图像
下载 Vue选择图像Vue选择图像 Vue 2.用于从列表中选择图像的组件 演示 https://mazipan.github.io/vue-select-image/ 安装 #纱 纱添加vue-se ...
- 拉格朗日乘子法与KKT条件
拉格朗日乘子法 \[min \quad f = 2x_1^2+3x_2^2+7x_3^2 \\s.t. \quad 2x_1+x_2 = 1 \\ \quad \quad \quad 2x_2+3x_ ...
- day19 Pyhton学习 递归函数
# 函数的递归 : 在一个函数的内部调用它自己 # import sys # sys.setrecursionlimit(1000000) # 设置递归的最大深度 # 总结 # 1.递归函数的定义 : ...