param

【RPC】一步一步实现基于netty+zookeeper的RPC框架(一)

試著忘記壹切 提交于 2019-11-29 05:00:51
随着分布式架构运用的越来越多,RPC框架成为了我们不得不掌握的知识,这里一步一步来手写一个简单的RPC框架,以博文作为记录及自我监督。 首先是技术选型,这边我选用的是当前比较流行的Netty+Zookeeper来实现,通过zookeeper的特性来实现服务注册与发现,通信则使用netty框架。 这里贴出github代码地址,想直接看代码的可以直接下载运行: https://github.com/whiteBX/wrpc 这里先来讲服务注册发现原理: 利用zookeeper的创建临时节点和watcher机制,可以做到在一个服务下注册多个服务器地址,并且在节点发生变动时通过watcher动态更新服务器列表,来达到在新增/修改/删除时自动注册发现/删除/更新服务器连接信息 .这里说一点,zookeeper的增删改操作会交由leader去处理,所以这里不用担心并发问题. zookeeper相关代码如下: public class ZKClient { /** * 获取zookeeper连接 * * @param connectString * @param sessionTimeout * @return */ public ZooKeeper newConnection ( String connectString , int sessionTimeout ) { ZooKeeper

【RPC】一步一步实现基于netty+zookeeper的RPC框架(六)

谁说我不能喝 提交于 2019-11-29 05:00:35
上一篇实现了服务的限流,本篇来实现服务的熔断。 首先还是贴出github代码地址,想直接看代码的可以直接下载运行: https://github.com/whiteBX/wrpc 在现在的微服务架构下,由于服务众多,调用链路长,很可能其中某个服务有时会出现异常导致服务不可用,例如发布导致bug、机房网络问题等,这种时候如果没有一种保护机制的话,很容易引起服务雪崩。这个时候就引入了服务熔断,本篇就来实现一个简单的熔断器。 首先我们定义一下熔断的状态,如下图: 此图中标注了我们熔断器的三种状态: 全开 半开 关闭 。 他们的流转过程为: 初始时为关闭状态。 当遇到错误到我们预设的阈值比例后转换为全开状态。 经过一定时间后,熔断器变为半开状态。 半开状态时允许通过一个请求,此请求成功则转为关闭状态,失败则变为全开状态。 接下来看代码实现: public class CircuitUtil { // 达到默认请求基数才判断开启熔断 private static final int DEFAULT_FAIL_COUNT = 5 ; // 半开转换为全开时间(毫秒数) private static final long DEFAULT_HALF_OPEN_TRANSFER_TIME = 10000 ; // 默认失败比例值开启熔断 private static final double

Web层通用数据处理之统一异常处理@ExceptionHandler

纵饮孤独 提交于 2019-11-29 04:41:40
  实际开发过程中会遇到对dao层、service层和controller层抛出的异常统一处理,对每个模块的方法进行异常处理也能解决问题,但这样是不合理的,并且代码看起来也不雅观,这时就可以使用@ExceptionHandler对Web层进行统一异常处理,让异常由下往上(dao—>service—>controller)抛出。   代码如下: import com.sand.base.core.common.BaseCommon; import com.sand.base.core.entity.ResultEntity; import com.sand.base.enums.ResultEnum; import com.sand.base.exception.LsException; import com.sand.base.util.ResultUtil; import com.sand.base.util.editor.DateEditor; import com.sand.base.util.editor.StringEditor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.converter.HttpMessageNotReadableException; import org

Java中使用Calendar进行获取指定时间,使用SimpleDateFormat进行格式化转换

拜拜、爱过 提交于 2019-11-29 04:14:18
java中使用Calendar获取指定的时间 public class DateTranslate { /** * 获取指定日期的间隔月份的第一天的日期 * @param date * @param sep * @return */ public static Date getMonthFirstDay(Date date, Integer sep) { Calendar cal = Calendar.getInstance(); cal.setTime(getThisWeekMonday(date)); cal.add(Calendar.MONTH, sep); cal.set(Calendar.DAY_OF_MONTH,1); return cal.getTime(); } /** * 获取上周一的日期 * @param date * @return */ public static Date getLastWeekMonday(Date date) { Calendar cal = Calendar.getInstance(); cal.setTime(getThisWeekMonday(date)); cal.add(Calendar.DATE, -7); return cal.getTime(); } /** * 获取昨天的时间 * @param date *

LinkedList

亡梦爱人 提交于 2019-11-29 03:36:16
public class LinkedList<E> extends AbstractList<E> { private Node<E> head; private int size; class Node<E> { private Node<E> next; private E e; Node(Node node, E e) { next = node; this.e = e; } Node(E e) { this.e = e; } } public int size() { return size; } /** * 添加元素 * @param e * @return */ @Override public boolean add(E e) { //初始化要加入的节点 Node node = new Node<E>(e); if (head == null) { head = node; return false; } Node temp = head; while (temp.next != null) { temp = temp.next; } temp.next = node; size++; return true; } /** * 添加指定位置元素 * @param index 索引 * @param e 元素 */ public void add(int index,

yaf设置cli脚本执行模式

◇◆丶佛笑我妖孽 提交于 2019-11-29 02:03:06
话不多说,刚配置好了yaf的脚本执行模式,提供给有需要的朋友。 效果如果如下: 代码如下: <?php // 脚本模式 define('APPLICATION_PATH', dirname(__FILE__)); $app = new Yaf\Application(APPLICATION_PATH . "/conf/application.ini"); $module = "index"; $controller = "index"; $method = "mqcon"; if ($argv[1]) $module = $argv[1]; if ($argv[2]) $controller = $argv[2]; if ($argv[3]) $method = $argv[3]; $param = $argv[4]?:[]; if ($param) { $param = convertUrlQuery($param); } $app->getDispatcher()->dispatch(new Yaf\Request\Simple("", $module, $controller,$method,$param)); //$app->getDispatcher()->dispatch(new Yaf\Request\Simple("mqcon", "index", "index",

分片上传

≯℡__Kan透↙ 提交于 2019-11-29 00:36:47
第一步 做MD5检查,如果服务端已经有相同的MD5值文件,则直接提示上传成功;如果已经上传一部分了则直接返回还没有上传部分的列表。 第二步 提交分片,服务端按照分片文件向文件中按照offset位置写入。 @RestController @RequestMapping(value = "/file") public class UploadController { private Logger logger = LoggerFactory.getLogger(UploadController.class); // @Autowired // private StringRedisTemplate stringRedisTemplate; @Autowired private StorageServiceImpl storageService; /** * 秒传判断,断点判断 * * @return */ @RequestMapping(value = "checkFileMd5", method = RequestMethod.POST) @ResponseBody public Object checkFileMd5(String md5) throws IOException { Map<String, HashMap<String, Object>> mapState =

Java数组定义及方法

微笑、不失礼 提交于 2019-11-29 00:19:02
数组的描述   在 数组 中每个元素都具有相同的数据类型,是 有序数据 的集合。通俗的说数组就相当于一个 容器 。数组分为一维数组、二维数组和多维数组。 数组的特点: 数组类型是从抽象基类 Array 派生的引用类型。 数值数组元素的默认值为 0,而引用元素的默认值为 null。 数组中存放元素的类型必须与创建数组时声明的类型相一致。 数组的类型可以是 任意数据类型 ,包括基本数据类型和引用数据类型,如String[]、int[] 、float[]… 数组的索引是从0开始的,如果数组有n个元素,那么它的最大索引为n-1,(数组索引的取值范围 [0,n-1] )。 数组的创建及赋值 一维数组的创建及赋值 一维数组内存格式(如下图): 动态创建数组(如下): /* 数据类型[] 数组名; //(建议使用) * 数组名 = new 数组类型[数组长度]; */ String[] str; str = new String[10]; str[2] = "Hello"; /* 或 * 数据类型 数组名[]; * 数组名 = new 数组类型[数组长度]; */ String str1[]; str1 = new String[10]; // 数组名[索引下标] = 元素值; str1[2] = "Hello"; /* * 元素类型[] 数组名 = new 元素类型[数组长度];

利用jquery动态添加和删除表格的一行,并且保存单行数据

女生的网名这么多〃 提交于 2019-11-29 00:05:48
开发时遇到一个需求:要求要在页面的表格可以添加和删除一行,并能填写对应的数据后保存这一行数据。 HTML代码 界面使用了freemarker框架,teams是后台传过来的list类型数据 <form action="" id="" method="post"> ... <table id="addTable" > <tr class="first_tr"> <th>姓名</th> <th>国籍</th> <th>单位</th> <th>职务</th> <th>专业、特长</th> <th>操作</th> </tr> <#list teams as item> <tr> <input type="hidden" id="id" value="${item.id!}"/> <td>${item.name!}</td> <td>${item.gj!}</td> <td>${item.dw!}</td> <td>${item.zw!}</td> <td>${item.zytc!}</td> <td><input type="button" onclick="delRow(this)" value="-删除"/></td> </tr> </#list> </table> <table> <tr> <td celspan="6"> <input type="button" onclick=

ROS | rosparameter server used in C++

淺唱寂寞╮ 提交于 2019-11-28 23:39:52
我在写 roslaunch file 的时候,插入了几个参数,其中一个 double 型的参数始终无法利用 rosparam 获取。 ROS官方的教程 Using Parameters in roscpp 并没有解决我的问题。 该laucn file 的逻辑很简单,就是把 role_name 和 detect_range 这两个参数送到 gap_selector 中去使用。然而,我只能获取到 role_name 却始终无法获得 detect_range 的值。 <!-- --> <launch> <arg name="role_name" default="hero" /> <arg name="detect_range" default="30.0" /> <node pkg="gap_selector" type="gap_selector" name="gap_selector" output="screen"> <param name="role_name" value="$(arg role_name)" /> <param name="detect_range" value="$(arg detect_range)" /> </node> </launch> 而同样的逻辑在 python 的文件里却没有问题,唯独在 C++ 写的 rosnode 中产生问题。