wechat

为你的 GitLab 项目使用 k3s Kubernetes 集群

梦想的初衷 提交于 2020-07-28 13:32:05
本文首发于: Jenkins 中文社区 原文链接 作者:Luc Juggery 译者:s1mple_zj TL;DR k3s 是一个轻量级的 Kubernetes 发行版(小于 40 MB),它非常容易安装,仅需要 512 MB 的 RAM。对 IoT 设备、边缘计算以及运行 CI 任务来说均是一个完美的选择。这篇文章中,我将创建一个 k3s 集群然后向你们展示怎样将它集成到一个 GitLab 项目中。 关于 k3s k3s 是一款由 Rancher Labs 开发的轻量级的 Kubernetes 发行版。 它作为 Kubernetes 认证的发行版使用最低的系统要求: Linux 3.10+ 每个服务器 521 MB ram 每个节点 75 MB ram 200 MB 磁盘空间 x86_64,ARMv7,ARM64 这使得 k3s 非常适合 IoT 相关的事物。 在 GitLab 创建一个项目 在安装 k3s 之前,我们先在 GitLab 上创建一个名为_api_的新项目。 创建完成后,我们进入到_Operation_>_Kubernetes_菜单。 这里我们有两种选择: 我们可以在 GKE(Google Kubernetes Engine)上创建一个 Kubernetes 集群。 我们可以导入一个已存在的 Kubernetes 集群的配置(不管在哪里创建的)。 **注意:*

Java笔试面试总结—try、catch、finally语句中有return 的各类情况

前提是你 提交于 2020-07-28 12:29:56
前言 之前在刷笔试题和面试的时候经常会遇到或者被问到 try-catch-finally 语法块的执行顺序等问题,今天就抽空整理了一下这个知识点,然后记录下来。 正文 本篇文章主要是通过举例的方式来阐述各种情况,我这里根据 try-catch-finally 语法块分为两种大情况讨论:try-catch 语法块和 try-catch-finally 语句块,然后再在每种情况里再去具体讨论。 一、try-catch 语句块 我们可以看看下面程序: public static void main(String[] args) { System.out.println(handleException0()); } /** * try,catch都有return * @return */ private static String handleException0() { try{ System.out.println("try开始"); String s = null; int length = s.charAt(0); System.out.println("try结束"); return "try块的返回值"; }catch (Exception e){ System.out.println("捕获到了异常"); return "catch的返回值"; } } 执行结果 :

从聚合支付业务的设计来聊聊策略模式

旧街凉风 提交于 2020-07-28 10:11:10
六月福利 2020年6月公众号码农小胖哥原创文章转发第一名将送全新《 Spring Boot实战 》实体书一本,该书是学习热门框架 Spring Boot 的经典之作。 你不再需要依靠运气,而是勤奋 。截止统计日期2020年6月30日,统计数据以官方公众号工具为准,运营人员不参加活动,本次活动图书由掘金社区赞助。 1. 前言 前几天讲了 设计模式中的命令模式 ,今天来看看另一个模式。移动支付目前在国内已经是非常普及了,连楼下早餐摊的七十多岁大妈也使用支付宝和微信支付卖鸡蛋饼。如果让你做一个App你肯定要考虑多个渠道支付,以保证获客渠道。如果让你来接入多种支付渠道你会怎么设计? 2. 通常写法 一般下面这种写法很容易被创造出来: public boolean pay(BigDecimal amount){ boolean ret =false; if (alipay){ //todo 支付宝的逻辑 }else if (wechatpay){ //todo 微信支付的逻辑 }else if (ooxx){ // …… } return ret; } 如果集成了四五种支付,这个代码就没法看了少说几千行,而且改动某个支付的逻辑很容易改了其它支付的逻辑。因此需要合理的设计来避免这种风险。 3. 策略模式 大部分的支付可以简化为这个流程: 中间的 发起支付前逻辑 和 支付后处理逻辑

java实现冒泡排序

…衆ロ難τιáo~ 提交于 2020-07-28 08:06:06
冒泡排序: 算法重复走访要排序的数列,一次比较两个元素,如果它们顺序错误就交换它们的位置,这样最大的数就到了最后,重复操作即可得到有序数列。 冒泡排序算法运行: 1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 3. 针对所有的元素重复以上的步骤,除了最后一个。 4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 代码实现: public static void main(String[] args) { int[] values = { 3, 1, 6, 2, 9, 0, 7, 4, 5, 8 }; bubbleSort(values); System.out.println(Arrays.toString(values)); } public static void bubbleSort(int[] values) { int temp; for (int i = 0; i < values.length; i++) { for (int j = 0; j < values.length - 1 - i; j++) { //减i原因:内层循环,每循环完一趟就在数组末产生一个最大数,即最大数就不用比较了。 if (values[j] >

终于有人把最适合学习算法的书单找出来了,面试必备!

房东的猫 提交于 2020-07-28 07:34:46
​​​​​​​ ​ 害,这年头算法真的不好学,但是笔试面试又非常爱考,那咋办呢?我来给你推荐几本算法学习好书吧,都是我当年秋招复习时用的,算法导论什么的都给我吃灰去吧!! 算法书单 ​ 算法图解 黄小斜的推荐语:这本书太适合入门了,特别是对于计算机非科班的我来说,用它来学算法的感觉非常酸爽,首先是图解的方法非常简单易懂,并且这本书里讲的算法都是非常常见和实用的,对你打好算法基础很有帮助! 本书示例丰富,图文并茂,以让人容易理解的方式阐释了算法,旨在帮助程序员在日常项目中更好地发挥算法的能量。书中的前三章将帮助你打下基础,带你学习二分查找、大O表示法、两种基本的数据结构以及递归等。余下的篇幅将主要介绍应用广泛的算法,具体内容包括:面对具体问题时的解决技巧,比如,何时采用贪婪算法或动态规划;散列表的应用;图算法;Kzui近邻算法。 作者简介 Aditya Bhargava,软件工程师,兼具计算机科学和美术方面的教育背景,在adit.io撰写编程方面的博客。 ​ 啊哈算法 黄小斜的推荐语:这本书怎么说呢,算法书里的一股清流,既有入门的算法内容,又有一些比较进阶的算法知识,比如动态规划、DFS和BFS这类算法,这些算法自己学起来真的头大,所以就特别需要别人来讲解,这本书真心把这些复杂的算法讲的很简单易懂了。需要参加算法面试笔试的同学必看! 《啊哈!算法》是一本充满智慧和趣味的算法入门书

微信公众号本地开发流程

孤街醉人 提交于 2020-07-28 04:57:46
1.建立测试号 直接打开链接,微信扫码登录即可测试号管理页面 https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index ,如下图所示 2.在测试号中的【网 页授权 获取用户基本信息】中,设置回调地址IP( localhost,127.0.0.1均不能使用,请使用局域网IP或域名,测试 号回调地址支持域名和ip,正式公众号回调地址只支持域名。 ) 3.下载微信开发者工具,选择公众号网页开发 4.填写要测试的地址,修改 rediect_uri 回调地址, 访问腾讯服务器url规则如下: https://open.weixin.qq.com/connect/oauth2/authorize?appid= 你当前测试号的 appid &redirect_uri= 你的接口路径 ( 记得 uri 码 ) &response_type=code&scope=snsapi_userinfo#wechat_redirect 5.访问以上地址的话,微信服务器会转发到另一个地址,地址中包含code,可以通过code获取到用户的openId(openId是微信用户唯一凭证) 例如:http://www.baidu.com/spic&code

到底什么级别才算是高并发?

為{幸葍}努か 提交于 2020-07-28 03:36:44
作者:边鹏_尛爺鑫 https://segmentfault.com/a/1190000010844969 大家心里仔细想想,当你们听到高并发网站时,心里对这个网站是个什么概念? 首先想到的是淘宝吗?带着问题,我们一起思考技术~ 写这个话题是因为我对搜索引擎给我的答案很不满意,然后决定把思考的一些东西分享出来,希望可以大家彼此讨论下。 我们经常在面试的时候,被问到有没有高并发的经验?先不说哪些考高并发的装逼公司。我思考的是什么才算是高并发?你一天几个pv肯定高不了。首先在网上查找一下,并未找到明确的标准定义。那么什么是并发呢? 并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。 摘自百度百科 我们说的高并发是什么? 上面的定义明显不是我们通常所言的并发,在互联网时代,所讲的并发、高并发,通常是指并发访问。也就是在某个时间点,有多少个访问同时到来。 我看到有人给高并发下了类似的定义: 高并发通常是指我们提供的系统服务能够同时并行处理很多请求。 来看看这个定义,这里首先把并发给混淆到并行了。关于并发并行的区别看这里我就不多说,继续探讨并发。 然后定义又说很多请求?什么叫很多请求?做为中国人,这个词让我想象力一发不可收拾......好了,拉回来,继续本文。 那么从上面的分析

26. Go 语言中通道死锁经典错误案例详解

回眸只為那壹抹淺笑 提交于 2020-07-27 22:01:42
Hi,大家好,我是明哥。 在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。 我的在线博客: http://golang.iswbm.com 我的 Github:github.com/iswbm/GolangCodingTime 刚接触 Go 语言的信道的时候,经常会遇到死锁的错误,而导致这个错误的原因有很多种,这里整理了几种常见的。 fatal error: all goroutines are asleep - deadlock! 错误示例一 看下面这段代码 package main import "fmt" func main() { pipline := make(chan string) pipline <- "hello world" fmt.Println(<-pipline) } 运行会抛出错误,如下 fatal error: all goroutines are asleep - deadlock! 看起来好像没有什么问题?先往信道中存入数据,再从信道中读取数据。 回顾前面的基础,我们知道使用 make 创建信道的时候,若不传递第二个参数,则你定义的是无缓冲信道

Spring 中的 bean 为什么默认单例?

大城市里の小女人 提交于 2020-07-27 18:56:22
作者:小小木 https://juejin.im/post/5cab7ebf518825177637b2f9 熟悉 Spring 开发的朋友都知道Spring提供了5种scope分别是singleton、prototype、request、session、global session。 如下图是官方文档上的截图,感兴趣的朋友可以进去看看这五种分别有什么不同。 今天要介绍的是这五种中的前两种,也是Spring最初提供的bean scope singleton 和 prototype。 Spring官方文档介绍如下图: 更多内容可以看官方文档介绍,非常详细: https://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html 单例bean与原型bean的区别 如果一个bean被声明为单例的时候,在处理多次请求的时候在 Spring 容器里只实例化出一个bean,后续的请求都公用这个对象,这个对象会保存在一个 map 里面。 当有请求来的时候会先从缓存( map )里查看有没有,有的话直接使用这个对象,没有的话才实例化一个新的对象,所以这是个单例的。 但是对于原型(prototype)bean来说当每次请求来的时候直接实例化新的bean,没有缓存以及从缓存查的过程。 1.画图分析 2.源码分析

你还在用迭代器处理集合吗?试试Stream,真香!

故事扮演 提交于 2020-07-27 12:55:10
首先给大家看一段代码,让大家直观感受下 Java7 和 Java8 遍历处理集合的不同 Dish 是一个菜肴对象,calories 属性表示该菜品的卡路里值,name 则是菜品的名称。我们需要过滤出卡路里小于400、然后根据卡路里值升序、接着拿到他们的名称列表并返回 Java7 public static List<String> getLowCaloricDishesNamesInJava7(List<Dish> dishes){ List<Dish> lowCaloricDishes = new ArrayList<>(); for(Dish d: dishes){ if(d.getCalories() < 400){ lowCaloricDishes.add(d); } } List<String> lowCaloricDishesName = new ArrayList<>(); Collections.sort(lowCaloricDishes, new Comparator<Dish>() { public int compare(Dish d1, Dish d2){ return Integer.compare(d1.getCalories(), d2.getCalories()); } }); for(Dish d: lowCaloricDishes){