SpringCloud应对高并发的思路
一、Eureka的高可用性
Eureka下面的服务实例默认每隔30秒会发送一个HTTP心跳给Eureka,来告诉Eureka服务还活着,每个服务实例每隔30秒也会通过HTTP请求向Eureka获取服务列表,这就相当于一个服务实例一分钟会与Eureka进行四次请求,当服务实例多了以后,就要考虑Eureka的压力,如果我们有1000个服务实例,一分钟就会有4000次请求,平均每秒70次请求,不过Eureka内部是通过内存建立一个HashMap来维护服务实例列表的,并且还做了读写分离,所以保证多个实例的心跳是没有问题的,要注意的是保证Eureka的高可用,生产环境中如果Eureka挂掉,相当于所有实例之间都没办法联系了,我们可以在多台机器上部署Eureka(尽量不要同时在一台机器上部署,因为出问题时,一般整个机器的资源都不能正常使用了),可以部署三个Eureka实例,然后将每个服务实例同时注册到三台Eureka上面,这样即使某个Eureka挂掉了,也不会影响整个系统的运行。
配置的方式也很简单,部署好多台Eureka实例后,只需要将每个服务实例分别注册到每个Eureka上面即可
eureka:
client:
serviceUrl:
defaultZone: http://eureka1:/eureka/, http://eureka2:/eureka/
二、服务熔断和服务降级
微服务之间的调用两种情况,网关与服务之间的调用,服务与服务之间的调用,当某个服务的响应时间过长,调用链就会等待,当请求量多了,就会引起雪崩,所以就需要用到服务熔断组件hystrix,当调用超时时直接返回,并且设置服务降级策略,当发生熔断时的补救措施,比如监控告警,记录SQL日志后续进行数据恢复等
1、服务降级配置
当出现服务熔断时,我们需要配置服务熔断的处理策略,服务降级有两种情况,网关层面做降级和服务之间做降级
(1)网关层面降级:只需要重写ZuulFallbackProvider的方法,即可定制返回值
@Component
public class GatewayFallback implements ZuulFallbackProvider
{
@Override
public String getRoute()
{
// 这里配置服务降级是针对哪个服务实例的,可以填写服务id,如果返回null则是针对所有服务
return null;
}
@Override
public ClientHttpResponse fallbackResponse()
{
// 服务熔断后,返回的内容
return new ClientHttpResponse()
{
@Override
public InputStream getBody() throws IOException
{
JSONObject result = new JSONObject();
result.put("error_code", -1);
result.put("error_info", "网络繁忙");
return new ByteArrayInputStream(result.toString().getBytes("UTF-8"));
}
@Override
public HttpHeaders getHeaders()
{
// 返回Json格式的数据
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
return headers;
}
@Override
public HttpStatus getStatusCode() throws IOException
{
// 返回的HTTP错误码
return HttpStatus.OK;
}
@Override
public int getRawStatusCode() throws IOException
{
return HttpStatus.OK.value();
}
@Override
public String getStatusText() throws IOException
{
return HttpStatus.OK.getReasonPhrase();
}
@Override
public void close()
{
// 进行一些自定义的处理,比如监控告警
}
};
}
}
(2)服务之间降级:服务之间的调用一般是使用Feign组件,我们需要为Feign接口声明的每个方法编写处理的逻辑,通过注解的fallback属性来指定服务降级的实现类
@FeignClient(value = "clientService", fallback = ClientServiceFallback.class)
public interface ClientService
{
@RequestMapping(method = RequestMethod.POST, value = "/test", produces = MediaType.APPLICATION_JSON_VALUE)
String queryClientById(@RequestParam("id") String id);
}
public class ClientServiceFallback implements ClientService
{
@Override
public String queryClientById(String id)
{
// 进行一些自定义的处理
return null;
}
}
2、服务熔断配置
服务熔断的参数配置非常重要,合理的参数配置才能更好地利用好机器资源,既不会浪费,也能合理对服务进行熔断防止雪崩
(1)熔断超时时间设置:这个时间一定要根据情况合理选择,不能太高也不能太低,如果设置太高,当服务出现问题时,每个线程都要等待很久,所有线程卡死就会导致用户根本无法正常使用,如果太小,出现网络波动就会影响服务质量,合理的设置一般是比如你的接口处理时间是200ms,那你可以设置300ms,比正常的响应时间大一点点,防止网络波动出现熔断
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds:
(2)Hystrix线程池大小设置:首先评估你的服务压力,比如你的服务每秒需要处理100个请求,每个请求的处理时间是200ms,相当于1个线程1秒可以处理5个请求,100/5=20,可以算出20个线程就可以处理请求,我们设置就可以设置25个线程,多给5个线程用来留些后路,防止一些特点时间点有大量的请求
hystrix.threadpool.default.coreSize:
三、最后
应对高并发,最重要还是先要保证业务逻辑的处理速度,才能从根本上优化,比如进行SQL查询时,尽量避免多表关联,SQL语句越简单越好,数据表加索引,不要使用外键,外键会在一定程度上影响性能,且不容易维护,我个人建议通过增加其他表的id字段来维护表之间的关系
SpringCloud应对高并发的思路的更多相关文章
- Memcached笔记——(四)应对高并发攻击【转】
http://snowolf.iteye.com/blog/1677495 近半个月过得很痛苦,主要是产品上线后,引来无数机器用户恶意攻击,不停的刷新产品各个服务入口,制造垃圾数据,消耗资源.他们的最 ...
- 《即时消息技术剖析与实战》学习笔记10——IM系统如何应对高并发
一.IM 系统的高并发场景 IM 系统中,高并发多见于直播互动场景.比如直播间,在直播过程中,观众会给主播打赏.送礼.发送弹幕等,尤其是明星直播间,几十万.上百万人的规模一点也不稀奇.近期随着武汉新型 ...
- Memcached笔记——(四)应对高并发攻击
近半个月过得很痛苦,主要是产品上线后,引来无数机器用户恶意攻击,不停的刷新产品各个服务入口,制造垃圾数据,消耗资源.他们的最好成绩,1秒钟可以并发6次,赶在Database入库前,Cache进行Mis ...
- 【Redis】1、Jedis对管道、事务以及Watch的操作来应对高并发
对于一个互联网平台来说,高并发是经常会遇到的场景.最有代表性的比如秒杀和抢购.高并发会出现三个特点: 1.高并发读取 2.高并发写入(一致性) 3.出现超卖问题 前端如何应对? 1.缓存静态数据,例如 ...
- java高并发解决思路
一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构.性能的要求都很简单,随着互联网业务的不断丰富,网站 ...
- 每一个程序员都应该知道的高并发处理技巧、创业公司如何解决高并发问题、互联网高并发问题解决思路、caoz大神多年经验总结分享
本文来源于caoz梦呓公众号高并发专辑,以图形化.松耦合的方式,对互联网高并发问题做了详细解读与分析,"技术在短期内被高估,而在长期中又被低估",而不同的场景和人员成本又导致了巨头 ...
- SSM(Spring+SpringMVC+MyBatis)高并发优化思路
SSM(Spring+SpringMVC+MyBatis)框架集由Spring.MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容).常作为数据源较简单的web项目的框架 ...
- php 处理高并发的思路
1.nginx 服务器,提高网站服务器并发性能 2.控制大文件的下载,减少CPU的消耗. 3.对于sql查询做缓存. 4.静态页面文件缓存. 5.CND缓存静态文件, 6.反向代理到多个服务器,用来分 ...
- 基于tomcat为了应对高并发模型实现webserver
在博客上,一个简单的AIOweb来样加工.查看AIO异步处理,依靠操作系统完成IO操作Proactor处理模型确实很强大,它可以实现高并发.高响应server一个很好的选择,但在tomcat中间con ...
随机推荐
- H5 _浏览器通知功能使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- C++中几种输入输出cin、cin.getline()、getline()、sscanf()、sprintf()、gets()等
1.cin和cout cout是输出流对象的名字,cin是输入流对象的名字 ,“<<”是流插入运算符(也可称流插入操作符〉,作用是将需要输出的内容插入到输出流中,默认的输出设备是显示器. ...
- java实现多线程使用多个代理ip的方式爬取网页页面内容
项目的目录结构 核心源码: package cn.edu.zyt.spider; import java.io.BufferedInputStream; import java.io.FileInpu ...
- python从入门到实践-5章if语句
#!/user/bin/env python cars = ['audi','bmw','subaru','toyota']for car in cars: if car == 'bmw': prin ...
- Dubbo+zookeeper构建高可用分布式集群(二)-集群部署
在Dubbo+zookeeper构建高可用分布式集群(一)-单机部署中我们讲了如何单机部署.但没有将如何配置微服务.下面分别介绍单机与集群微服务如何配置注册中心. Zookeeper单机配置:方式一. ...
- 阿里分布式事务解决方案-GTS
摘要: 本文将深入和大家探讨微服务架构下,分布式事务的各种解决方案,并重点为大家解读阿里巴巴提出的分布式事务解决方案----GTS.该方案中提到的GTS是全新一代解决微服务问题的分布式事务互联网中间件 ...
- #Java学习之路——基础阶段(第十篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
- [Swift]LeetCode59. 螺旋矩阵 II | Spiral Matrix II
Given a positive integer n, generate a square matrix filled with elements from 1 to n2 in spiral ord ...
- Python--(爬虫与数据库的连接)
(每一天都是属于你的!) Python对于初学后巩固基础的人还是更多的来接触python爬虫会更好一些,在Python爬虫中包含很多基础部分知识,并且在项目中会提升你的成功感!加油! 我在工作之余时间 ...
- Android 普通通知栏新方法,现在需要创建通知渠道才可以
先看看效果看看是不是你想要的 点击后 话不多所,贴代码 xml文件: <?xml version="1.0" encoding="utf-8"?>& ...