Entry

Spring Cloud Alibaba系列(五)sentinel实现服务限流降级

孤街醉人 提交于 2020-08-17 07:35:46
一、sentinel是什么 sentinel的官方名称叫分布式系统的流量防卫兵。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。在Spring Cloud项目中最开始我们使用的是Hystrix,目前已停止更新了。现在Spring Cloud官方推荐的是rensilience4j。当然还有我们今天学习的sentinel。 Sentinel 具有以下特征: 丰富的应用场景 :Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。 完备的实时监控 :Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运 行情况。 广泛的开源生态 :Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。 完善的 SPI 扩展点 :Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。 二、sentinel实现限流 2.1

使用Java API进行tar.gz文件及文件夹压缩解压缩

霸气de小男生 提交于 2020-08-17 07:30:44
在java(JDK)中我们可以使用 ZipOutputStream 去创建zip压缩文件,(参考我之前写的文章 使用java API进行zip递归压缩文件夹以及解压 ),也可以使用 GZIPOutputStream 去创建gzip(gz)压缩文件,但是java中没有一种官方的API可以去创建 tar.gz 文件。所以我们需要使用到第三方库 Apache Commons Compress 去创建 .tar.gz 文件。 在pom.xml中,我们可以通过如下的maven坐标引入commons-compress。 <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-compress</artifactId> <version>1.20</version> </dependency> 解释说明 tar文件准确的说是打包文件,将文件打包到一个tar文件中,文件名后缀是 .tar Gzip是将文件的存储空间压缩保存,文件名后缀是 .gz tar.gz 或 .tgz 通常是指将文件打包到一个tar文件中,并将它使用Gzip进行压缩。 如果您阅读完本文觉得对您有帮助的话,请给我一个赞,您的支持是我不竭的创作动力! 一、将两个文件打包到tar.gz 下面的这个例子是将2个文件打包为 tar.gz 压缩文件

理解Docker(2):Docker 镜像

笑着哭i 提交于 2020-08-17 05:25:11
本系列文章将介绍Docker的有关知识: (1) Docker 安装及基本用法 (2) Docker 镜像 (3) Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 (4) Docker 容器的隔离性 - 使用 cgroups 限制容器使用的资源 (5) Docker 网络 对于每个软件,除了它自身的代码以外,它的运行还需要有一个运行环境和依赖。不管这个软件是象往常一样运行在物理机或者虚机之中,还是运行在现在的容器之中,这些都是不变的。在传统环境中,软件在运行之前也需要经过 代码开发->运行环境准备 -> 安装软件 -> 运行软件 等环节,在容器环境中,中间的两个环节被镜像制作过程替代了。也就是说,镜像的制作也包括运行环境准备和安装软件等两个主要环节,以及一些其他环节。因此,Docker 容器镜像其实并没有什么新的理论,只是这过程有了新的方式而已。 镜像(image)是动态的容器的静态表示(specification),包括容器所要运行的应用代码以及运行时的配置。Docker 镜像包括一个或者多个只读层( read-only layers ),因此,镜像一旦被创建就再也不能被修改了。一个运行着的Docker 容器是一个镜像的实例( instantiation )。从同一个镜像中运行的容器包含有相同的应用代码和运行时依赖。但是不像镜像是静态的

python3通过ssh操作mysql

北慕城南 提交于 2020-08-17 05:06:02
# coding=utf-8 import pymysql import configparser from tkinter import * from tkinter import ttk, messagebox from sshtunnel import SSHTunnelForwarder config = configparser.ConfigParser() if not config.read('sys.ini'): config['ssh'] = { 'host': '', 'user': '', 'passwd': '' } config['db'] = { 'host': '', 'user': '', 'passwd': '' } with open('sys.ini', 'w') as configfile: config.write(configfile) ssh_host = config['ssh']['host'] ssh_user = config['ssh']['user'] ssh_pwd = config['ssh']['passwd'] db_host = config['db']['host'] db_user = config['db']['user'] db_pwd = config['db']['passwd'] server =

【微信小程序】springboot后台获取用户的openid

↘锁芯ラ 提交于 2020-08-17 04:30:05
openid可以标识一个用户,session_key会变,所以来获取一下openid。 openid不能在微信小程序中直接获取,需要后台发送请求到微信的接口,然后微信返回一个json格式的字符串到后台,后台处理之后,再返回到微信小程序。 发布的小程序需要https的域名,而测试的时候可以使用http。 小程序在app.js中,修改login()中的内容: // 登录 wx.login({ success: res => { // 发送 res.code 到后台换取 openId, sessionKey, unionId if (res.code) { wx.request({ url: 'http://localhost:84/user/login' , method: 'POST' , data: { code: res.code }, header: { 'content-type': 'application/x-www-form-urlencoded' }, success(res) { console.log( "openid:"+ res.data.openid); if (res.data.openid != "" || res.data.openid!= null ){ // 登录成功 wx.setStorageSync("openid", res.data

Spring 文件上传/下载 案例代码

≯℡__Kan透↙ 提交于 2020-08-16 16:55:54
/** * @author zhiwei_yang * @time 2020-6-18-8:29 */ @RestController @RequestMapping("/file") @Slf4j public class FileController { /** * 文件下载 * * @param downPath * @return */ @PostMapping("/down") public ResponseEntity<byte[]> down(@RequestParam("downPath") String downPath) { if (StringUtils.isEmpty(downPath)) { return ResponseEntity.notFound().build(); } String fileName = downPath.substring(downPath.lastIndexOf(File.separator) + 1); InputStream inputStream = null; try { if (StringUtils.startsWithIgnoreCase(downPath, ResourceUtils.FILE_URL_PREFIX)) { inputStream = new FileInputStream

SimpleDateFormat和ThreadLocal联合使用

ⅰ亾dé卋堺 提交于 2020-08-16 12:08:07
SimpleDateFormat线程不安全问题 SimpleDateFormat大家都用过,日期与字符串转换的类,它的方法是线程不安全的。有同学就说了,这个方法不安全也没事啊,不就是做个日期转换,现编写一下代码 package com.huawei.test; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Locale; public class ProveNotSafe { public static void main(String[] args) { for (int i=0;i<5;i++){ new Thread(new DateFormatTest()).start(); } } } class DateFormatTest implements Runnable{ static SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd", Locale.US); @Override public void run() { try { System.out.println(Thread.currentThread().getName()+":"+df.parse("2020-09-11")); }

ThreadLocal(未完全理解)

丶灬走出姿态 提交于 2020-08-16 11:01:56
1.是什么? ThreadLocal是一个工具类,它为每个线程提供一个单独的变量副本存放这个线程的私有变量,其他线程不能改变其值。 2.内部结构、原理 每个线程有一个ThreadlocalMap,里面存放Entry键值对,key是ThreadLocal(??),value是变量副本。 3.内存泄漏: key时弱引用,value是强引用,如果key被回收了而value没,就会存在key==null的Entry,无法回收value,可能会造成内存泄漏。 解决办法是:使用ThreadLocal方法后,最好手动调用remove方法。 来源: oschina 链接: https://my.oschina.net/u/4527334/blog/4305575

leetcode1460(通过翻转子数组使两个数组相等)--Java语言实现

浪尽此生 提交于 2020-08-16 07:37:07
求: 给你两个长度相同的整数数组 target 和 arr 。 每一步中,你可以选择 arr 的任意 非空子数组 并将它翻转。你可以执行此过程任意次。 如果你能让 arr 变得与 target 相同,返回 True;否则,返回 False 。 示例 1: 输入:target = [1,2,3,4], arr = [2,4,1,3] 输出:true 解释:你可以按照如下步骤使 arr 变成 target: 1- 翻转子数组 [2,4,1] ,arr 变成 [1,4,2,3] 2- 翻转子数组 [4,2] ,arr 变成 [1,2,4,3] 3- 翻转子数组 [4,3] ,arr 变成 [1,2,3,4] 上述方法并不是唯一的,还存在多种将 arr 变成 target 的方法。 示例 2: 输入:target = [7], arr = [7] 输出:true 解释:arr 不需要做任何翻转已经与 target 相等。 示例 3: 输入:target = [1,12], arr = [12,1] 输出:true 示例 4: 输入:target = [3,7,9], arr = [3,7,11] 输出:false 解释:arr 没有数字 9 ,所以无论如何也无法变成 target 。 示例 5: 输入:target = [1,1,1,1,1], arr = [1,1,1,1,1] 输出

JAVA集合框架-集合实现(三)[云图智联]

淺唱寂寞╮ 提交于 2020-08-16 07:35:20
1、ArrayList实现原理: ArrayList是List接口的可变数组非同步实现,并允许包括null在内的所有元素; 底层使用数组实现; 该集合是可变长度数组,数组扩容时,会将老数组中的元素重新拷贝一份到新的数组中,每次数组容量增长大约是其容量的1.5倍,这种操作的代价很高。 采用了Fail-Fast机制,面对并发的修改时,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险。 remove方法会让下标到数组末尾的元素向前移动一个单位,并把最后一位的值置空,方便GC。 2、LinkedList实现原理: LinkedList是List接口的双向链表非同步实现,并允许包括null在内的所有元素。 底层的数据结构是基于双向链表的,该数据结构我们称为节点。 双向链表节点对应的类Node的实例,Node中包含成员变量:prev,next,item。其中,prev是该节点的上一个节点,next是该节点的下一个节点,item是该节点所包含的值。 它的查找是分两半查找,先判断index是在链表的哪一半,然后再去对应区域查找,这样最多只要遍历链表的一半节点即可找到。 3、HashMap实现原理: HashMap是基于哈希表的Map接口的非同步实现,允许使用null值和null键,但不保证映射的顺序。 底层使用数组实现,数组中每一项是个单向链表,即数组和链表的结合体