springCloud进阶(微服务架构&Eureka)
springCloud进阶(微服务架构&Eureka)
1. 微服务集群
1.1 为什么要集群
为了提供并发量,有时同一个服务提供者可以部署多个(商品服务)。这个客户端在调用时要根据一定的负责均衡策略完成负载调用。

1.2 服务提供者集群-同一种服务(服务名)部署多个
实际生产就是同一种服务多部署几台服务器,开发时就是用端口来区分。
1) 拷贝一份8001
2) 修改主类-改名
3) 改8002yml,端口
4) 服务提供者
1.3 服务消费者负载均衡调用
1)常见的负载均衡技术
Ribbon feign
2)常见的负载均衡
轮休
可用性检查
权重
|
内置负载均衡规则类 |
规则描述 |
|
RoundRobinRule(默认) |
简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。 |
|
AvailabilityFilteringRule |
对以下两种服务器进行忽略: (1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。 注意:可以通过修改配置loadbalancer.<clientName>.connectionFailureCountThreshold来修改连接失败多少次之后被设置为短路状态。默认是3次。 (2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上线,可以由客户端的<clientName>.<clientConfigNameSpace>.ActiveConnectionsLimit属性进行配置。 |
|
WeightedResponseTimeRule |
为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。 |
|
ZoneAvoidanceRule |
以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。 |
|
BestAvailableRule |
忽略哪些短路的服务器,并选择并发数较低的服务器。 |
|
RandomRule |
随机选择一个可用的服务器。 |
|
Retry |
重试机制的选择逻辑 |
3)ribbon
a. 配置层添加@LoadBAlanced注解
/**
* RestTemplate调用远程接口
* @author Lenovo
*/
@Configuration
public class BaseConfig {
@Bean
@LoadBalanced //开启负载均衡
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
b. controller层代码
@RestController
@RequestMapping("/order")
public class OrderController { @Autowired
private RestTemplate restTemplate; /**
* 通过服务名完成调用
*/
private final String URL_PREFIX = "http://PRODUCT-SERVICE/product/"; /**
* 暴露通过id远程查询product的接口
* @param id
* @return
*/
@GetMapping("/product/{id}")
public Product getProductById(@PathVariable("id") Long id){
/**
* 缺点:要拼接的地址很长
*/
String url = URL_PREFIX + id;
//以接口的方式进行调用
return restTemplate.getForObject(url,Product.class);
}
}
controller层代码
2) feign
a. 主类配置扫描client
/**
* 如果你的client就在该类的子子孙孙包,否则必须指定包名
* 加了它以后,就会扫描加了@FeignClient这个注解的接口,并且为这些接口产生代理对象
* 并且把这些代理对象纳入spring管理,我们要使用时直接获取就可以完成远程调用
*
*/
@EnableFeignClients
b. client代码
@FeignClient(value = "PRODUCT-SERVICE") //里面所有的方法都要调用PRODUCT-SERVCIE这个服务
@RequestMapping("/product")
public interface ProductClient {
/**
* 回掉托底
*/
@GetMapping("/{id}")
public Product getProductById(@PathVariable(name = "id") Long id);
}
ProductClient
c. controller层代码。(注解注入client调用接口)
@RestController
@RequestMapping("/order")
public class OrderController { @Autowired
private ProductClient productClient; /**
* 暴露通过id远程查询product的接口
* @param id
* @return
*/
@GetMapping("/product/{id}")
public Product getProductById(@PathVariable("id") Long id){
return productClient.getProductById(id);
}
}
OrderController
2. hystrix断路器
2.1 hystrix是什么
微服务架构储器服务健壮的框架
2.2 hystrix作用
解决微服务架构的雪崩现象
2.3 hystrix解决雪崩的措施
资源隔离(限流):包括线程池隔离和信号量隔离,限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用。
熔断:当失败率达到阀值自动触发降级(如因网络故障/超时造成的失败率高),熔断器触发的快速失败会进行快速恢复。
降级机制:超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据。
缓存:提供了请求缓存、请求合并实现。
2.4 配置hystrix
1)导入依赖
<!--断路器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2)主类添加@EnableHystrix注解
@EnableHystrix //开启hystrix 熔断和降级才会生效
3)controller层代码
@RestController
@RequestMapping("/product")
public class ProductController {
@Autowired
private ProductService productService; /**
* 根据id查询单条数据
* @param id
* @return
*/
@GetMapping("/{id}")
@HystrixCommand(fallbackMethod = "findOneFallback")
public Product findOne(@PathVariable(name = "id") Long id) {
//如果传入的id=2,报一个错让他熔断,其他的正常访问
if (id.intValue() == 2){
throw new RuntimeException("报错了!");
}
Product product = productService.findOne(id);
//为了查看是那个服务(端口运行得)
product.setName(product.getName() + "-8003");
return product;
} private Product findOneFallback(Long id) {
return new Product(id, "已经熔断啦...");
}
}
ProductController
2.5 feign
feign熔断机制是封装hystrix
1)托底关键代码
/**
* 这个工程类要给我们配一个ProductClient的托底类
* @author Lenovo
*/
@Component
public class ProductClientFallbackFactory implements FallbackFactory<ProductClient> { /**
* 里面就是返回托底类,里面要为每个方法都有一个托底方法
* @param throwable
* @return
*/
@Override
public ProductClient create(Throwable throwable) {
return new ProductClient() {
@Override
public Product getProductById(Long id) {
return new Product(id, "feign的托底方法");
}
};
}
}
ProductClientFallbackFactory
2)修改ProductClient@FeignClient注释
指定托底方法
@FeignClient(value = "PRODUCT-SERVICE", fallbackFactory = ProductClientFallbackFactory.class)
3. zuul路由网关
3.1 zuul路由网关是什么
为外部访问提供统一的入口,并且我们可以通过过滤完成过度,并且封装负载均衡ribbon,封装了熔断hystrix
3.2 实现zuul路由网关
1)基本配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency> <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency> <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
yml配置
server:
port: 4399
spring:
application:
name: ZUUL-GATEWAY
eureka:
client:
service-url:
defaultZone: http://eureka-7001.com:7001/eureka, http://eureka-7002.com:7002/eureka
instance:
instance-id: gateway-4399.com
prefer-ip-address: false
主类添加@EnableZuulProxy注解
@EnableZuulProxy //启用zuul代理
2)路由访问加固(不用服务名,映射路径)
zuul:
routes:
myUser.serviceId: product-service # 服务名
myUser.path: /dyier/** # 把dyier打头的所有请求都转发给product-service服务
ignored-services: "*" #所有服务都不允许以服务名来访问
prefix: "/services" #加一个统一前缀
3)拦截器实现登陆
filter代码
@Component
public class LoginFilter extends ZuulFilter {
/**
* 过滤器类型
* - pre:请求在被路由之前执行
* - routing:在路由请求时调用
* - post:在routing和errror过滤器之后调用
* - error:处理请求时发生错误调用
* @return
*/
@Override
public String filterType() {
return "pre";
} /**
* 设置优先级,值越小越优先
* @return
*/
@Override
public int filterOrder() {
return 1;
} /**
* 是否执行本过滤器
* @return
*/
@Override
public boolean shouldFilter() {
return true;
} /**
* 过滤的逻辑
* @return
* @throws ZuulException
*/
@Override
public Object run() throws ZuulException {
//获取上下文
RequestContext currentContext = RequestContext.getCurrentContext();
//获取请求
HttpServletRequest request = currentContext.getRequest();
//从请求头中获取token
String token = request.getHeader("token");
//判断是否登陆
if (null == token || "".equals(token)) {
//校验失败
currentContext.setSendZuulResponse(false);
//返回一个状态码401。也可以重定向
currentContext.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);
}
// 校验通过,可以考虑把用户信息放入上下文,继续向后执行
return null;
}
}
LoginFilter
4)配置超时管理
zuul:
retryable: true
ribbon:
ConnectTimeout: 250 # 连接超时时间(ms)
ReadTimeout: 2000 # 通信超时时间(ms)
OkToRetryOnAllOperations: true # 是否对所有操作重试
MaxAutoRetriesNextServer: 2 # 同一服务不同实例的重试次数
MaxAutoRetries: 1 # 同一实例的重试次数
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMillisecond: 3000 # 熔断超时时长:3000ms
4. springCloud Config分布式配置中心
4.1 为什么需要配置
实现配置文件统一管理(application.yml)
4.2 架构

4.3 实现步骤
1)准备github配置文件
2)configserver(服务端):通过它读取配置文件
application.yml
server:
port: 1299
eureka:
client:
service-url:
defaultZone: http://eureka-7001.com:7001/eureka,http://eureka-7002.com:7002/eureka # 集群
instance:
prefer-ip-address: true
spring:
application:
name: SPRING-CLOUD-CONFIG-SERVER
cloud:
config:
server:
git:
uri: 仓库地址
username: 账号
password: 密码
3)configclient(客户端):真正读取配置文件的地方
bootstrop.yml
spring:
cloud:
config:
name: application-user #github上面名称
profile: dev #环境
label: master #分支
uri: http://127.0.0.1:1299 #配置服务器
eureka:
client:
service-url:
defaultZone: http://eureka-7001.com:7001/eureka, http://eureka-7002.com:7002/eureka # 集群
instance:
prefer-ip-address: true #显示客户端真实ip
springCloud进阶(微服务架构&Eureka)的更多相关文章
- 用SpringCloud进行微服务架构演进
在<架构师必须要知道的阿里的中台战略与微服务> 中已经阐明选择SpringCloud进行微服务架构实现中台战略,因此下面介绍SpringCloud的一些内容,SpringCloud已经出来 ...
- SpringCloud学习--微服务架构
目录 微服务架构快速指南 SOA Dubbo Spring Cloud Dubbo与SpringCloud对比 微服务(Microservice)架构快速指南 什么是软件架构? 软件架构是一个包含各种 ...
- SpringCloud(一):微服务架构概述
1-1. 系统进化理论概述 在系统架构与设计的实践中,经历了两个阶段,一个阶段是早些年常见的集中式系统,一个阶段是近年来流行的分布式系统: 集中式系统: 集中式系统也叫单体应用,就是把所有的程序.功 ...
- Spring cloud 微服务架构 Eureka篇
1 服务发现 ## 关于服务发现 在微服务架构中,服务发现(Service Discovery)是关键原则之一.手动配置每个客户端或某种形式的约定是很难做的,并且很脆弱.Spring Cloud提供了 ...
- 简单记录下SpringCloud的微服务架构和一些概念
一.微服务的注册与发现——Eureka 和许多分布式设计一样,分布式的应用一般都会有一个服务中心,用于记录各个机器的信息.微服务架构也一样,我们把一个大的应用解耦成这么多个那么多个服务,那么在想要调用 ...
- springcloud(二) 微服务架构编码构建
微服务架构编码构建 1 基础知识 1.1 版本 2 微服务cloud整体聚合父工程Project 2.1 new project 2.2 字符编码设置 utf-8 2.3 pom.xml 2.4 父工 ...
- SpringCloud 构建微服务架构-练习
我使用的springboot的版本为2.0.2.RELEASE,这里概念性的东西我就不粘贴复制了,百度一下 都是 一.启动Eureka注册中心服务 1.新建springboot项目,pom.xml配置 ...
- 微服务架构eureka集群高可用配置
工具:idea 环境:java8.maven3 版本:spring boot 1.5.15.RELEASE 1.搭建spring boot eureka项目 2. pom.xml添加相应依赖,如下: ...
- 基于spring-cloud的微服务(2) eureka服务提供方的注册和消费方的消费
启动Eureka注册中心之后,服务提供方就可以注册到Eureka上去(作为一个Eureka的客户端) 我们使用IDEA提供的spring initializer来新建一个springcloud项目 填 ...
随机推荐
- Java基于OpenCV实现走迷宫(图片+路线展示)
Java基于OpenCV实现走迷宫(图片+路线展示) 由于疫情,待在家中,太过无聊.同学发了我张迷宫图片,让我走迷宫来缓解暴躁,于是乎就码了一个程序出来.特此记录. 原图: 这张图,由于不是非常清晰, ...
- 简单看看读写锁ReentantReadWriteLock
前面我们看了可重入锁ReentrantLock,其实这个锁只适用于写多读少的情况,就是多个线程去修改一个数据的时候,适合用这个锁,但是如果多个线程都去读一个数据,还用这个锁的话会降低效率,因为同一时刻 ...
- json通过后台获取数据库中的内容,并在前端进行显示
fastjson.jar以及Echarts树图的js文件(需要在servlet对json进行赋值,所以需要用到json的插件) 链接:https://pan.baidu.com/s/1GBbamPNG ...
- Ceph 存储集群1-配置:硬盘和文件系统、配置 Ceph、网络选项、认证选项和监控器选项
所有 Ceph 部署都始于 Ceph 存储集群.基于 RADOS 的 Ceph 对象存储集群包括两类守护进程: 1.对象存储守护进程( OSD )把存储节点上的数据存储为对象: 2.Ceph 监视器( ...
- 命令行压缩解压缩一 7z
命令行压缩解压缩一 7z 1) 简介 7z,全称7-Zip, 是一款开源软件.是目前公认的压缩比例最大的压缩解压缩软件. 主页:http://www.7-zip.org/ 中文主页:http: ...
- python学习记录(五)
20180829--https://www.cnblogs.com/fnng/archive/2013/04/20/3032563.html 字典 字典的使用 现实中的字段及在Python中的字段都进 ...
- pandas 使用总结
import pandas as pd import numpy as np ## 从字典初始化df ipl_data = {'Team': ['Riders', 'Riders', 'Devils' ...
- Codeforces_828
A.模拟,注意单人的时候判断顺序. #include<bits/stdc++.h> using namespace std; int n,a,b; int main() { ios::sy ...
- 一口气说出 9种 分布式ID生成方式,面试官有点懵了
整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 本文作者:程序员内点事 原文链接:https://mp.weix ...
- Java Stack使用
1.Stack继承自Vector.遵从先进后出的规则. 2.Stack 是线程同步的.(map.List.Set是线程不同步的,需要在外部封装的时候来同步) 试例代码: public static v ...