程序员泥瓦匠

程序员泥瓦匠 查看完整档案

杭州编辑温州医科大学  |  bug 疏通专业 编辑杭州某厂  |  bug 落地疏通师 编辑 bysocket.com 编辑
编辑

公号:程序员泥瓦匠。一枚技术草根,坚持分享算法,架构等干货~

个人动态

程序员泥瓦匠 发布了文章 · 1月19日

微服务架构对企业来说,带来什么价值?有啥弊端?

file

微服务架构,这 5 年左右一直被认可,是软件架构的未来方向。需要大家理解的是,为什么需要服务化。比如微服务架构对企业来说,带来什么价值?有啥弊端?

这里浅谈一下微服务架构,主要还是在理解 Why :为什么需要服务化?

https://weiyucloud.com/

一、对微服务架构的理解

1.1 微服务架构

file

微服务架构,主要是多了个 “微”。亚马逊有个粗粗的定义:一个微服务应用工程的所有开发、测试、运维加起来大约 6 到 8 个人,只需要两个披萨就可以聚餐了。

反例:不是一个 Service 类组成的应用工程,发布成服务就是微服务。这样分的太小,理解微服务就很片面。杭州某金融大厂,曾经分的很细,造成了运维测试成本巨大。开始分了合,折腾...

1.2 为啥需要微服务?

由 SOA 架构 -> 微服务架构的转变,得理解为什么微服务架构被广泛提到并实践。它解决了什么问题,带来了什么价值?

传统企业或者很多企业的软件,大多不止一套系统,都是各个独立大系统的堆砌。整体存在的问题是:

  • 扩展性差
  • 可靠性不高
  • 维护成本还很大
  • 重复轮子很多

file

那么这些问题,可以想到的解决方案就是:

  • 组件化
  • 服务化

微服务架构,将各个组件或者模块分散到各个服务中,对整个系统实现解耦。那微服务架构强调的重中之重就是业务系统需要完善的组件化和服务化。什么是组件化?

组件化,即将一个大系统,按照一定的业务或者技术维度关注形式,拆分成独立的组件。目的是为了分而治之,为了可重用,为了减少耦合度。比如按照技术维度:搜索组件、缓存组件;按照业务维度:用户中心、支付中心等

file

组件化是不是有点中台的意思?阿里巴巴提出 大中台,小前台;就是把组件化、插件化、服务化解决方案到极致。通过产品线公共业务或者技术下沉,形成各种技术或者业务中台

file

(图来自漫画程序员小灰)

二、服务化前的问题

2.1 没有服务化,不代表不是分布式或集群

分布式,就是多个实例提供相同的服务。比如多个地方动车站里面,多个机器提供取票服务。多个地方,北京上海等,就是多机房,多个取票服务一起组成了集群,形成分布式服务。那啥是服务化?

服务化,强调 “化”!核心就是不同服务之间的通信。是一种以服务为中心的解决方案:

  • 服务注册
  • 服务发布
  • 服务调用
  • 服务监控
  • 服务负载均衡
  • 等等

file

2.2 没有服务化的架构问题

没有服务化前,举个例子,会更形象:

假设有个取票服务、买票服务、改座服务都需要验证下用户身份真实性,那么会存在下面的问题:

  • 取票服务 -> 调用用户DB代码 -> 用户DB
  • 买票服务 -> 调用用户DB代码 -> 用户DB
  • 改座服务 -> 调用用户DB代码 -> 用户DB

file

明显的问题是:

  • 代码重复:不同业务相同访问 DB 的 userDAO 代码逻辑。而且每个服务这块代码是不同人维护的。
  • 可维护性低:不同人维护;不同地方维护;每次 DB 字段改变或者迁库,全部业务都有修改
  • DB 访问耦合

自然也有解决方案是:lib。维护一个 user-DAO-lib 1.0.0 release 包,给各个业务方。

解决了问题,引入了新的问题,lib 升级是巨大而又漫长的问题。比如小李是维护 user-DAO-lib 的人,有一次写了隐蔽的 bug 。user-lib 升级到了 1.0.1 release,花了 1 个月左右时间,推几十个业务方升级完毕。然后这个 bug 运行了几天出现了,考虑升级fix或者回滚都是巨大的成本

基于服务化,就可以完美解决问题。

三、服务化后的好处

file

如图 Post 文章服务调用 Video 视频服务,需要通过最上层的 Service 之间相互调用。服务化明显改变:

  • DB 隔离:这样底层细节设计可以屏蔽,后续加上其他存储 Cache 等对业务调用方无感知。
  • 通过 Service 之间通信:具体协议可以 RPC / HTTP 等

服务化后的好处:

  • 调用简单:不用写相同的访问用户服务代码,调用一个服务即可
  • 代码复用:跟 lib 形式的代码复用有所区别在于,服务化通过通信的方式解决
  • 业务隔离
  • 数据库解耦
  • 等等

四、不可否认的微服务架构或者服务化带来新的问题

1、本身不大的系统,业务不复杂的系统也不需要微服务架构。微服务架构会带来一定的复杂性,是一套完整的服务治理方案
2、多个模块数据库,分布式事务是一个挑战
3、开发过程,增加了测试等一定的复杂性

有利必有弊,具体场景具体选择

五、小结

本小结,不是讲how,讲的是 why。只有懂 why ,才能更好地 do。从为啥服务化?到为啥微服务架构这么流行:

  • 微服务扩展性高
  • 微服务可靠性高
  • 微服务 维护成本小
  • 微服务几乎没有重复轮子
  • 微服务直接调用调用简单
  • 微服务业务隔离
  • 微服务数据库解耦
  • 等等

参考资料:引流推广

本文由博客一文多发平台 OpenWrite 发布!
查看原文

赞 3 收藏 3 评论 0

程序员泥瓦匠 发布了文章 · 2020-11-27

为什么要微服务架构服务化?

file

微服务架构,这 5 年左右一直被认可,是软件架构的未来方向。需要大家理解的是,为什么需要服务化。比如微服务架构对企业来说,带来什么价值?有啥弊端?

这里浅谈一下微服务架构,主要还是在理解 Why :为什么需要服务化?

一、对微服务架构的理解

1.1 微服务架构

file

微服务架构,主要是多了个 “微”。亚马逊有个粗粗的定义:一个微服务应用工程的所有开发、测试、运维加起来大约 6 到 8 个人,只需要两个披萨就可以聚餐了。

反例:不是一个 Service 类组成的应用工程,发布成服务就是微服务。这样分的太小,理解微服务就很片面。杭州某金融大厂,曾经分的很细,造成了运维测试成本巨大。开始分了合,折腾...

1.2 为啥需要微服务?

由 SOA 架构 -> 微服务架构的转变,得理解为什么微服务架构被广泛提到并实践。它解决了什么问题,带来了什么价值?

传统企业或者很多企业的软件,大多不止一套系统,都是各个独立大系统的堆砌。整体存在的问题是:

  • 扩展性差
  • 可靠性不高
  • 维护成本还很大
  • 重复轮子很多

file

那么这些问题,可以想到的解决方案就是:

  • 组件化
  • 服务化

微服务架构,将各个组件或者模块分散到各个服务中,对整个系统实现解耦。那微服务架构强调的重中之重就是业务系统需要完善的组件化和服务化。什么是组件化?

组件化,即将一个大系统,按照一定的业务或者技术维度关注形式,拆分成独立的组件。目的是为了分而治之,为了可重用,为了减少耦合度。比如按照技术维度:搜索组件、缓存组件;按照业务维度:用户中心、支付中心等

file

组件化是不是有点中台的意思?阿里巴巴提出 大中台,小前台;就是把组件化、插件化、服务化解决方案到极致。通过产品线公共业务或者技术下沉,形成各种技术或者业务中台

file

(图来自漫画程序员小灰)

二、服务化前的问题

2.1 没有服务化,不代表不是分布式或集群

分布式,就是多个实例提供相同的服务。比如多个地方动车站里面,多个机器提供取票服务。多个地方,北京上海等,就是多机房,多个取票服务一起组成了集群,形成分布式服务。那啥是服务化?

服务化,强调 “化”!核心就是不同服务之间的通信。是一种以服务为中心的解决方案:

  • 服务注册
  • 服务发布
  • 服务调用
  • 服务监控
  • 服务负载均衡
  • 等等

file

2.2 没有服务化的架构问题

没有服务化前,举个例子,会更形象:

假设有个取票服务、买票服务、改座服务都需要验证下用户身份真实性,那么会存在下面的问题:

  • 取票服务 -> 调用用户DB代码 -> 用户DB
  • 买票服务 -> 调用用户DB代码 -> 用户DB
  • 改座服务 -> 调用用户DB代码 -> 用户DB

file

明显的问题是:

  • 代码重复:不同业务相同访问 DB 的 userDAO 代码逻辑。而且每个服务这块代码是不同人维护的。
  • 可维护性低:不同人维护;不同地方维护;每次 DB 字段改变或者迁库,全部业务都有修改
  • DB 访问耦合

自然也有解决方案是:lib。维护一个 user-DAO-lib 1.0.0 release 包,给各个业务方。

解决了问题,引入了新的问题,lib 升级是巨大而又漫长的问题。比如小李是维护 user-DAO-lib 的人,有一次写了隐蔽的 bug 。user-lib 升级到了 1.0.1 release,花了 1 个月左右时间,推几十个业务方升级完毕。然后这个 bug 运行了几天出现了,考虑升级fix或者回滚都是巨大的成本

基于服务化,就可以完美解决问题。

三、服务化后的好处

file

如图 Post 文章服务调用 Video 视频服务,需要通过最上层的 Service 之间相互调用。服务化明显改变:

  • DB 隔离:这样底层细节设计可以屏蔽,后续加上其他存储 Cache 等对业务调用方无感知。
  • 通过 Service 之间通信:具体协议可以 RPC / HTTP 等

服务化后的好处:

  • 调用简单:不用写相同的访问用户服务代码,调用一个服务即可
  • 代码复用:跟 lib 形式的代码复用有所区别在于,服务化通过通信的方式解决
  • 业务隔离
  • 数据库解耦
  • 等等

四、不可否认的微服务架构或者服务化带来新的问题

1、本身不大的系统,业务不复杂的系统也不需要微服务架构。微服务架构会带来一定的复杂性,是一套完整的服务治理方案
2、多个模块数据库,分布式事务是一个挑战
3、开发过程,增加了测试等一定的复杂性

有利必有弊,具体场景具体选择

五、小结

本小结,不是讲how,讲的是 why。只有懂 why ,才能更好地 do。从为啥服务化?到为啥微服务架构这么流行:

  • 微服务扩展性高
  • 微服务可靠性高
  • 微服务 维护成本小
  • 微服务几乎没有重复轮子
  • 微服务直接调用调用简单
  • 微服务业务隔离
  • 微服务数据库解耦
  • 等等

参考资料

本文由博客一文多发平台 OpenWrite 发布!
查看原文

赞 2 收藏 2 评论 0

程序员泥瓦匠 发布了文章 · 2020-11-17

微信公众号Makrdown编辑器,语法你懂吗?

感谢 WeChat Format 源码: https://github.com/lyricat/we...

其他工具推荐:

img

Markdown 使用教程

  • Markdown 是什么?
  • 怎么使用 Markdown?

Markdown 是什么?

Markdown是一种轻量级标记语言,它以纯文本形式(易读、易写、易更改)编写文档,并最终以HTML格式发布。

Markdown也可以理解为将以MARKDOWN语法编写的语言转换成HTML内容的工具

为什么 要使用它?

  • 它是易读(看起来舒服)、易写(语法简单)、易更改纯文本。处处体现着极简主义的影子。
  • 兼容HTML,可以转换为HTML格式发布。
  • 跨平台使用。
  • 越来越多的网站支持Markdown。
  • 更方便清晰地组织你的电子邮件。(Markdown-here, Airmail)
  • 摆脱Word。

如果不算扩展,Markdown的语法绝对简单到让你爱不释手。

三、Markdown 语法

Markdown语法主要分为如下几大部分:

标题段落区块引用代码区块强调列表分割线链接图片反斜杠 \\符号'`'

3.1 标题

两种形式:

1)使用=-标记一级和二级标题。

一级标题
=========
二级标题
---------

效果:

一级标题

二级标题

2)使用#,可表示1-6级标题。

\# 一级标题
\## 二级标题
\### 三级标题
\#### 四级标题
\##### 五级标题
\###### 六级标题

效果:

一级标题

二级标题

三级标题

四级标题

五级标题
六级标题

3.2 段落

段落的前后要有空行,所谓的空行是指没有文字内容。若想在段内强制换行的方式是使用两个以上空格加上回车(引用中换行省略回车)。

3.3 区块引用

在段落的每行或者只在第一行使用符号>,还可使用多个嵌套引用,如:

\> 区块引用
\>> 嵌套引用

效果:

区块引用

嵌套引用

3.4 代码区块

代码区块的建立是在每行加上4个空格或者一个制表符(如同写代码一样)。如
普通段落:

void main()
{

printf("Hello, Markdown.");    

}

代码区块:

void main()
{
    printf("Hello, Markdown.");
}

注意:需要和普通段落之间存在空行。

3.5 强调

在强调内容两侧分别加上*或者_,如:

\斜体\,\斜体\
\\粗体\\,\\_粗体\\_

效果:

斜体,_斜体_
粗体,__粗体__

3.6 列表

使用·+、或-标记无序列表,如:

\-(+\*) 第一项
\-(+\*) 第二项
\- (+\*)第三项

注意:标记后面最少有一个_空格_或_制表符_。若不在引用区块中,必须和前方段落之间存在空行。

效果:

  • 第一项
  • 第二项
  • 第三项

有序列表的标记方式是将上述的符号换成数字,并辅以.,如:

1 . 第一项
2 . 第二项
3 . 第三项

效果:

  1. 第一项
  2. 第二项
  3. 第三项

3.7 分割线

分割线最常使用就是三个或以上*,还可以使用-_

3.8 链接

链接可以由两种形式生成:行内式参考式
行内式

\[OpenWrite官网地址\]\(https:://openwrite.cn "OpenWrite"\)。

效果:

OpenWrite官网地址

参考式

\[OpenWrite官网地址1\]\[1\]
\[OpenWrite官网地址2\]\[2\]
\[1\]:https:://openwrite.cn "OpenWrite"
\[2\]:https:://openwrite.cn "OpenWrite"

效果:

OpenWrite官网地址1
OpenWrite官网地址2

注意:上述的[1]:https:://openwrite.cn "OpenWrite"不出现在区块中。

4.9 图片

添加图片的形式和链接相似,只需在链接的基础上前方加一个

4.10 反斜杠\\

相当于反转义作用。使符号成为普通符号。

4.11 符号'`'

起到标记作用。如:

\`ctrl+a\`

效果:

ctrl+a

谁在用?

Markdown 的使用者:

  • GitHub
  • 简书
  • Stack Overflow
  • Apollo
  • Moodle
  • Reddit
  • 等等
本文由博客一文多发平台 OpenWrite 发布!
本文由博客一文多发平台 OpenWrite 发布!
查看原文

赞 0 收藏 0 评论 0

程序员泥瓦匠 发布了文章 · 2020-10-12

OpenWrite 创始人 DD

OpenWrite 创始人 DD,必须了解下:https://t.1yb.co/6hk1

程序猿DD 是谁?
• 个人博客介绍:http://blog.didispace.com/abo...
• 思否社区采访:https://segmentfault.com/a/11...
• 开源中国采访:https://gitee.com/gitee-stars/9

「程序猿 DD」星球,是一个汇聚互联网技术人的社群。少讲大道理,只会分享、讨论以及职场心得。

免费预约百人拼团活动:https://t.1yb.co/6hk1

「程序猿 DD」已经复活,第二春的输出内容很丰富,你不来了解一下?

https://t.1yb.co/6hk1

「程序猿 DD」星球,是一个汇聚互联网技术人的社群,深度分享、讨论以及职场心得。

随着这半年的建设,我们的核心内容已经非常丰富,并还在持续产出中:

2 大固定系列专栏:

「#技术人」系列(每周三):分享技术高手行走江湖的绝技以及职场心得;
「#社会人」系列(每周六):分享踏入社会切身相关需要知道知识与思维;

4 大专题系列专栏:

「#技术资源」系列分享对技术提升很多有用的工具、网站等;
「#技术问答」用心回答对技术问题或者技能提升的干货方法;
「#职业规划」系列分享对职场提升很多有用的回答、建议等;
「#轻享」系列分享行业朋友们的所见所思所得:思维方法等;

10月份我们打算再搞一次,百人拼团活动,免费预约赶紧上车:https://t.1yb.co/6hk1

本文由博客群发一文多发等运营工具平台 OpenWrite 发布
查看原文

赞 1 收藏 0 评论 0

程序员泥瓦匠 发布了文章 · 2020-10-11

程序猿DD 是谁?

赞 1 收藏 0 评论 0

程序员泥瓦匠 发布了文章 · 2020-10-11

为什么程序猿DD热衷于内容输出与分享?

一、热衷于内容输出与分享

我是程序猿DD,大家知道我热衷于内容输出与分享。比如我一直有在产出博客或维护开源项目,是因为平时不沉迷游戏或追剧,空下来就喜欢整理整理最近碰到的问题,那么写写博客正好是一种比较好的方式,一方面是整理自己的理解, 另外一方面也是收集其他开发者想法的地方。毕竟人无完人,我写的也不一定是对的,这是一种非常好的交流和学习的方式。


我朋友曾跟我说过:把复杂的事情简单化,跟大家做朋友,解决彼此的问题,顺便分享有价值的东西给大家,并且持续分享就行来。因为这样,别说养活我一个人,养活 10 个人都没问题。我一直记得这句话,所以到现在我一直在围绕有价值的内容,进行疯狂的输出。这也是我一直坚持原创内容输出到今天的原因。


在知识星球「程序猿DD」里面,我会输出各种原创干货,覆盖技术各个领域,少讲大道理,只会分享干货、用心讨论以及输出职场心得。

关于知识星球「程序猿DD」社群

「程序猿 DD」社群,是一个汇聚互联网技术人的社群。 我们创建于 2017 年,已运行 3 年。这个圈子不贵,但超值!我们励志打造一个垂直服务于技术人的成长类星球!在这里,我们除了要在技术上有所突破,更要在综合认知上有所长进!因此,在本星球中设立 6 大系列专栏精华分享,10000+ 个提问的用心回答,覆盖技术各个领域,少讲大道理,只会分享、讨论以及职场心得。

社群,我是当产品技术一样去研发,考虑用户运营,内容运营,活动运营等等。比如让用户在这里有链接,有成长,都需要我去思考,和以前做开发不一样,这些需要我去策划,我从来没有做过运营,但现在每个分享,每个活动设计都需要我去思考。

# 之前很多朋友错了上一期优惠,问我还有优惠吗?其实我的星球价值远远超过了门票。刚好,10 月会员日活动,组织了个百人拼团活动。如果你想加入,赶紧通过下面二维码加入拼团预约群了解:

?扫一扫二维码,免费预约

二、这个星球的价值是什么?

技术实现的产品要体现用户的价值,那么「程序猿 DD」社群的价值就是为了垂直服务于技术人的成长和成功。

6 大系列专栏:

  • 「#技术人」系列分享技术高手行走江湖的绝技以及职场心得;
  • 「#社会人」系列分享踏入社会切身相关需要知道知识与思维;
  • 「#技术资源」系列分享对技术提升很多有用的工具、网站等;
  • 「#技术问答」用心回答对技术问题或者技能提升的干货方法;
  • 「#职业规划」系列分享对职场提升很多有用的回答、建议等;
  • 「#轻享」系列分享行业朋友们的所见所思所得:思维方法等;

【人脉对接】专人对接、技术聚会、快闪群、圈友内推,资源免费对接

【线下活动】饭局的诱惑、同城见面会、垂直主题闭门会、技术大咖俱乐部(即将开启)、读书活动等

在「程序猿 DD」星球里面,离努力的技术社会人更近一点,一起分享,一起成长 ~

「技术人」系列

抛不开的老本行话题,这里会分享各种我见到的觉得不错的分享、讨论以及职场心得。同时,也收录星球中不错的问题讨论,很多讨论放到现在依然可以持续进行,欢迎你的加入!多一点不一样的声音,可能就打开了一种全新的问题解决思路!

「社会人」系列

当我们离开学校踏入社会,我们所要面对的一切都变的复杂起来。我们的关注点需要扩大,因为你已经成为了一名标准的社会人。如果你认为从学生到社会人只需要把原来的学习精力转移到工作精力就好,那么就完全错了。除了工作之外,你有不少知识要补,有不少思维需要转变。这个系列将带着你了解那些可能你平时不去关注,但又与我们切身相关的政策变化等话题。

# 如何加入「程序猿 DD」星球这一期百人拼团活动?心动不如行动,赶紧通过下面二维码加入拼团预约群了解:

?扫一扫二维码,免费预约

10000+ 个用心提问和轻享

社群里面最有价值的是链接,首先是我跟大家的链接。我和大家彼此认识,建立信任和关系。3 年内,我不间断得回答了上千个提问。熟悉我的老朋友都知道,我喜欢分享,因为这一种非常好的交流和学习的方式。有一个话题的出现,让大家也彼此链接和交流。可能我回答的不一定都对,但是别怕还有社群里面的很多朋友,是大家让这个社群变的有温暖。这里,感谢一直在社群里面的朋友:

  1. Java 劝退师
  2. JVM 资深专家
  3. 源码研究系列博主
  4. 淘宝集团中间件开发
  5. 支付宝高级设计专家等等

这些朋友不断的会分享行业里面的所见所思所得:思维方法、商业实操、产品设计等,见下图:

优秀圈子人脉链接

社群里面最有价值的是链接,首先是我跟大家的链接,最重要得是链接大家一群人。大家彼此认识,建立关系。今年疫情后,我们会在全国各个城市组织「饭局的诱惑」,让我们会汇聚一起,聊技术,聊互联网,聊生活。小酌微醺,相当于近百场小型分享会,这种形式也能让大家交流更透彻,认识好朋友,彼此信任,相互帮助,形成更深层次的对接。是大家让这个社群变的有温暖

越多厉害的人聚在一起,越厉害的人变得越真诚。


没有筛选的社群,没有价值;筛选门槛越高的社群,越有价值。100 元的价格,确实是不错的筛选门槛,愿意付费的人,他一定会有某些特质,你想多认识了解一下。通过筛选出相对靠谱的人之后,为圈友创造各种链接场景,如:

  • 【人脉对接】专人对接、技术聚会、快闪群、圈友内推,资源免费对接
  • 【线下活动】饭局的诱惑、同城见面会、垂直主题闭门会、技术大咖俱乐部、读书活动等

定一个小目标:让社群的所有人认识所有人

# 心动不如行动,赶紧通过下面二维码加入拼团预约群了解:

?扫一扫二维码,免费预约

那么社群适合哪些人?

  1. 在校学生:希望我的经验可以帮助你了解我们专业、行业是干嘛的,解惑毕业就业过程中的各种疑虑等!
  2. 开发人员:老本行了,多年开发经验与架构经验。对于技术从未退却热情,除了主动分享,有趣的问题我也热于与你谈谈我的思路。如果你对自己的职业发展有些许迷茫,我也可以跟你聊聊我从国企辞职到私企从小开发到架构到合伙人的各种心得。
  3. 斜杠青年:对复业与创业刚兴趣的,自然是可以深入交流。因为我就是一位典型的热爱创业与复业的程序员,所以也会各种知识都了解一些,这样才容易迸发各种跨界的思考与想法嘛。

加入程序猿DD星球 10 月拼团!

「程序猿 DD」星球活动 10 月拼团,将在 10 月 14 日晚 20:00 整开放,持续两天。新用户拼团价 119¥/年(即将涨价至 ¥299/年)

拼团活动:

  • 新用户将享受推广期限时折扣,请及时关注当前的最新优惠活动。
  • 支持 3 天无理由退款
  • 拼团在 10 月 14 日晚 20:00 整开放,持续两天

另外学生特惠,全日制在校大学生:

  • 进预约群凭学生证,享受折上折半价优惠
  • 贫困/残疾:提供相关证明,申请免费资格。命运或许对您不公平,然而努力就有希望 ~

# 为了更好的服务和分享给诸位,星球全年会阶梯涨价。机不可失时不再来,赶紧加入吧:

?扫一扫二维码,免费预约

老规矩,优惠价下调为下半年最低价,然后阶梯涨价,每满 1000 人加入,涨 100 元。

老规矩,星球支持三天无理由退款,如果加入后觉得不合适,三天内退出全额退款。

参与优惠活动的话,参考以下步骤:

  1. 现在设定一个  10 月 14 号晚 19:50 的闹钟
  2. 然后加入「程序猿 DD」星球预约微信群,具体拼团活动链接会在微信群发布:

?扫一扫二维码,免费预约

本文由博客群发一文多发等运营工具平台 OpenWrite 发布
查看原文

赞 0 收藏 0 评论 0

程序员泥瓦匠 发布了文章 · 2020-10-09

Spring Cloud Eureka 服务注册中心怎么配置

「Spring Cloud Eureka 入门系列」
Spring Cloud Eureka 入门 (一)服务注册中心详解
Spring Cloud Eureka 入门 (二)服务提供者详解
Spring Cloud Eureka 入门 (三)服务消费者详解

本文提纲

  1. Eureka 服务治理

1.1 什么是 Eureka
1.2 Eureka 集群架构

  1. 运行 Eureka 工程 springcloud-eureka-server
  2. 详解 Eureka 工程 springcloud-eureka-server

一、Eureka 服务治理

1.1 什么是 Eureka

Eureka,这里是 Spring Cloud Eureka 的简称,是 Spring Cloud Netflix 组件之一。Spring Cloud Netflix 中核心的组件包括了服务治理(Eureka),服务容断(Hystrix),路由(Zuul)和客户端负载均衡(Ribbon)。在系列第三篇,服务消费者讲解会涉及到 Ribbon 的使用。

回到 Spring Cloud Eureka,是基于 Netflix Eureka (Netflix 是 Java 实现的开源软件)。服务治理(Eureka)包括服务注册、服务发现和服务检测监控等,自然本文介绍下 Eureka 作为服务注册中心。

1.2 Eureka 架构

Eureka 作为服务治理,必然满足下面几点:

  • 服务本身不存在单点故障,
  • 支持集群,即高可用性
  • 服务与服务之间通过服务注册中心找到彼此实例

作为服务端(即服务注册中心),包括

  • 管理服务实例
  • 提供服务注册或下线
  • 提供服务发现
  • 提供服务注册表至两类客户端(即服务提供者和消费者)

作为客户端(即服务提供者和消费者),包括

  • 连接服务注册中心
  • 向服务注册中心注册或者下线服务实例
  • 向服务注册中心或服务注册缓存列表查询服务

二、运行 Eureka 工程 springcloud-eureka-server

运行环境:JDK 7 或 8,Maven 3.0+
技术栈:Spring Cloud Dalston.SR1、 spring-cloud-netflix 1.3.1、Spring Boot 1.5.4

  1. git clone 下载工程 springcloud-learning-example

项目地址见 GitHub - https://github.com/JeffLi1993...
git clone https://github.com/JeffLi1993...

  1. Maven 编译安装这个工程:

cd springcloud-learning-example
mvn clean install

  1. 运行 springcloud-eureka-server Eureka 工程

右键 Main 函数 Run Eureka Server 启动类 EurekaServerApplication,启动服务注册中心工程。
EurekaServerApplication 类地址:/springcloud-learning-example/springcloud-eureka-sample/springcloud-eureka-server/src/main/java/org/spring/springboot/EurekaServerApplication.java

控制台 Console 看到这类信息,代表启动成功:

2017-06-30 10:32:47.549  INFO 2977 --- [      Thread-11] e.s.EurekaServerInitializerConfiguration : Started Eureka Server
2017-06-30 10:32:47.625  INFO 2977 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8888 (http)
2017-06-30 10:32:47.626  INFO 2977 --- [           main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8888
2017-06-30 10:32:47.632  INFO 2977 --- [           main] o.s.springboot.EurekaServerApplication   : Started EurekaServerApplication in 23.168 seconds
  1. 访问 Eureka 注册中心可视化界面

打开浏览器,访问 http://localhost:8888/

可以看到主体信息包括:

  • 系统状态:环境、运行时间、更新时间等
  • 注册信息:服务名、服务地址、服务状态
  • 基本信息:环境、内存、副本信息
  • 实例信息:IP、端口

三、详解 Eureka 工程 springcloud-eureka-server

1.springcloud-eureka-server 工程目录结构

├── pom.xml
└── src
    └── main
        ├── java
        │   └── org
        │       └── spring
        │           └── springcloud
        │               ├── EurekaServerApplication.java
        └── resources
            └── application.yml

EurekaServerApplication.java Eureka Server 启动类
application.yml 配置文件

  1. pom.xml 配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>springcloud</groupId>
    <artifactId>springcloud-eureka-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springcloud-eureka-server :: Spring Cloud Eureka 服务注册中心</name>

    <!-- Spring Boot 启动父依赖 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.4.RELEASE</version>
    </parent>

    <dependencies>
        <!-- Spring Cloud Netflix Eureka Server 依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>

        <!-- Spring Boot Test 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <!-- Spring Cloud Netflix 依赖 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-netflix</artifactId>
                <version>1.3.1.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

使用的依赖是

  • spring-cloud-netflix 1.3.1 是 Spring Cloud Dalston.SR1 版本。
  • spring-cloud-starter-eureka-server Eureka Server 模块依赖

上面提到的客户端负载均衡 Ribbon ,可以依赖树中看出 spring-cloud-starter-eureka-server 依赖了 Ribbon 相关的库。因为一般 eureka 本身作为服务自注册实现高可用,也可以作为客户端调用其他服务。

  1. application.yml 配置
server:
  port: 8888 # 服务端口

eureka:
  instance:
    hostname: localhost # 设置主机名
  client:
    registerWithEureka: false # 是否向 Eureka 注册服务。该应用为服务注册中心,不需要自注册,设置为 false
    fetchRegistry: false      # 是否检索服务。该应用为服务注册中心,职责为注册和发现服务,无需检索服务,设置为 false
  server:
    waitTimeInMsWhenSyncEmpty: 0 # 设置同步为空时的等待时间。默认 5 * MINUTES
  • server.port 设置工程服务端口
  • eureka.instance.hostname Eureka 实例主机名
  • eureka.client.registerWithEureka 是否向 Eureka 注册服务。服务注册中心服务,没有作为集群,所以不需要自注册,设置为 false
  • eureka.client.fetchRegistry 是否检索服务。该应用为服务注册中心,职责为注册和发现服务,无需检索服务,设置为 false
  • eureka.server.waitTimeInMsWhenSyncEmpty 设置同步为空时的等待时间。默认 5 * MINUTES

4.注册中心应用启动类

/**
 * Spring Boot Eureka Server 应用启动类
 *
 * Created by bysocket on 21/06/17.
 */
@EnableEurekaServer     // Eureka Server 标识
@SpringBootApplication  // Spring Boot 应用标识
public class EurekaServerApplication {

    public static void main(String[] args) {
        // 程序启动入口
        // 启动嵌入式的 Tomcat 并初始化 Spring 环境及其各 Spring 组件
        SpringApplication.run(EurekaServerApplication.class,args);
    }
}

@EnableEurekaServer 标志该应用作为 Eureka Server ,并会自动化读取相关配置。

四、小结

此小章节介绍了如何 Eureka 作为服务注册中心 Server,下一小结讲下 服务提供者详解 具体是如何向服务注册中心注册自己的。系列目录如下:

本文由博客群发一文多发等运营工具平台 OpenWrite 发布
查看原文

赞 2 收藏 2 评论 0

程序员泥瓦匠 发布了文章 · 2020-10-06

Java开发手册精华总结

阿里 Java 开发手册的思考总结

一个优秀的工程师和一个普通的工程师的区别,不是满天飞的架构图,他的功底体现在所写的每一行代码上。
-- 毕玄

1. 命名风格

【书摘】类名用 UpperCamelCase 风格,比如 DO/BO/VO/PO

【书摘】方法用 lowerCamelCase 风格,尽量是动词

小思考:例如常用的

  • 获取单个对象,getUserById
  • 获取对象累不,listUserByGroupId
  • 统计对象数量,countUserByClassId
  • 新增、删除,insert,delete,update 等

2. 常量定义

【书摘】如果变量值仅在一个范围变化,则用 enum 类型

小思考:例如电商中订单状态,用手指也能列出来。所以一般定义个 OrderSatausEnum 搞定,伪代码如下:

public enum OrderSatausEnum {
    TO_PAY(1,"代付款"), PAID(2,"已付款") ...;
    
    private Integer orderStatus;
    private String orderSatausDes;
    
    OrderSatausEnum(Integer orderStatus,String orderSatausDes) {
        this.orderStatus = orderStatus;
        this.orderSatausDes = orderSatausDes;
    }
    
    // get set
}

进一步,如果订单某天要加个“待拼团”状态咋办?所以这些配置化的东西,可以上配置中心。比如携程出的 apollo 等

3. OOP 规则

【书摘】Object 的 equals 方法容易抛空指针异常,应使用常量或者确定优质的对象来调用 equals 。

比如:“TO_PAY”.equals(order.getOrderStatus())。反着写就不对了,因为 order.getOrderStatus() 可能为 null。

自然,更加推荐 java.util.Objects#equals 工具类。

【书摘】所有相同类型的包装类对象之间的值比较,全部使用 equals 方法。

小思考:别用 == 了。equals 也要注意些事情,比如 Byte 类型的 status 对象值,用 equals 要注意如下:

getStatus().equals(0) // 反例,false
getStatus().equals((byte)0) // 正例,true

还有, == 比如 Integer 在 -128 到 127 范围比较正常,超过就不正常。原因是 -128 到 127 范围的对象在 IntegerCache.cache 中产生,会复用对象。所以所以,切记切记,别用 == 了,用 equals 去比较。

4. 集合处理

【书摘】不要在 for 循环中进行元素的 remove/add 操作。remove 请使用 Iterator 方法,如果有并发操作,则对 Iterator 对象加锁。

具体 Iterator 怎么操作集合,百度下即可。这还是典型的 迭代器设计模式,可以深入源码看看人家的简单实现原理,又能学到一发高级知识。

5. 并发处理

【书摘】第一,线程必须通过线程池来提供,不允许显式创建线程。第二,线程池不允许用 Executors 创建,应使用 ThreadPoolExecutor 去创建。因为
Executors 创建的几种 ThreadPool 会有弊端:

  • FixedThreadPool 和 SingleThreadPool 允许请求队列长度为 Integer.MAX_VALUE ,大量请求,会导致 OOM
  • CachedThreadPool 和 ScheduledThreadPool 允许创建最大的线程数为 Integer.MAX_VALUE,大量创建线程,会导致 OOM

所以,使用 ThreadPoolExecutor 的原因是能更好地理解线程池的运行规则,规避资源耗尽,更好地贴合某个业务场景,去创建更适合的线程池。


【书摘】在高并发场景中,同步调用应该考虑锁的性能损耗。能用无锁数据结构,就不要用锁;能锁区块,就不要锁整个方法体;能用对象锁,就不要用类锁。即,加锁的粒度越小,性能损耗越小。并且避免锁的代码块中调用了 RPC 方法。

另外,同时对多个资源加锁的时候,需要保持一致的加锁顺序。否则,一个线程加锁顺序为 ABC,另一个加锁顺序为 ACB 或 BAC 等,会造成死锁。如图:

file


【书摘】金融资金相关信息,使用悲观锁。比如更新某个用户的钱包余额字段。

小思考:我以前做 P2P 的时候,就很简单地使用了 MySQL 的行锁。

SELECT * FROM xx WHREER xx.id=888 FOR UPDATE

具体行锁,表锁大家可以自行百度了解。

6. 控制语句

【书摘】高并发场景,比如秒杀场景,商品扣库存,库存的判断不要用“等于”来判断商品库存已售罄的条件。应使用大于或者小于的条件来代替。

小思考:这是典型的超卖场景。有人会问也会存在超卖几件的问题吧?答案是是的。但如果用 等于 来判断,超卖的件数会很多很多,比如达到 1 万件。但超卖 1 万件和超卖 1 件是不一样等级的故障。或者是一个故障和一个不是故障的区别。

7.异常处理

【书摘】异常不要用来做流程控制,条件控制

小思考:昨天京东小哥问我,这个能这么搞降级吗?如下代码:

try {
    searchFromES()
}catch(){
    searchFromDB()
}

这不算降级,这也不能这么搞。第一,代码这也写就不对,异常不要用来做流程控制,条件控制。第二,这个只要实现 ES 读取有问题,读取不到就读 DB。可以考虑责任链设计模式去实现。伪代码如下:


ESHandle {
    void handle() {
        try {
            searchFromES()
        }catch(){
        }
    }
}

DBHandle {
    void handle() {
        try {
            searchFromES()
        }catch(){
        }
    }
}

// 两个 Handle 利用责任链去实现即可。

8. 建表规约 、SQL 语句

【书摘】当单表行数超过 500 万行或者单表容量超过 2 GB时,才推荐进行分库分表。

如果预计三年后的数量级无法达到这个级别,请不要在创建表时就分库分表。


【书摘】不要使用 count(列名) 或者 count(常量) 来替代 count(*)。 因为它是 SQL92 定义的标准统计行数的预发。它会统计 NULL 的行。


【书摘】where 条件下里面的 in 能避免就避免,要注意 in 里面的集合数量,控制在 1000 个之内。


【书摘】在代码中写分页查询,如果 count 为 0 ,直接返回 空列表。避免执行下面的分页语句。

9.服务器

【书摘】高并发服务器建议调小 TCP 协议的 time_wait 超时时间。Linux 修改 /etc/sysctl.conf 文件,代码如下:

net.ipv4.tcp_fin_timeout = 30

【书摘】JVM 设置参数 -XX:+HeapDumpOnOutOfMemoryError。让 JVM 碰到 OOM 的时候,输出 dump 信息。

小思考:这个很重要。二者得保留事故服务器现场。比如 OOM 了某个服务器,则在 VIP 或者啥摘到该机器,让该机器不再有请求进入。然后去查看 dump 信息,去排查 OOM 问题。

工程师对于代码,一定要精益求精,不论从性能,还是简洁优雅,都要具备精益求精的工匠精神,认真打磨自己的作品。
-- 多隆

本文由博客群发一文多发等运营工具平台 OpenWrite 发布
查看原文

赞 8 收藏 7 评论 0

程序员泥瓦匠 发布了文章 · 2020-10-04

【强烈推荐】阿里 Java 开发手册的思考总结

阿里 Java 开发手册的思考总结

一个优秀的工程师和一个普通的工程师的区别,不是满天飞的架构图,他的功底体现在所写的每一行代码上。
-- 毕玄

1. 命名风格

【书摘】类名用 UpperCamelCase 风格,比如 DO/BO/VO/PO

【书摘】方法用 lowerCamelCase 风格,尽量是动词

小思考:例如常用的

  • 获取单个对象,getUserById
  • 获取对象累不,listUserByGroupId
  • 统计对象数量,countUserByClassId
  • 新增、删除,insert,delete,update 等

2. 常量定义

【书摘】如果变量值仅在一个范围变化,则用 enum 类型

小思考:例如电商中订单状态,用手指也能列出来。所以一般定义个 OrderSatausEnum 搞定,伪代码如下:

public enum OrderSatausEnum {
    TO_PAY(1,"代付款"), PAID(2,"已付款") ...;
    
    private Integer orderStatus;
    private String orderSatausDes;
    
    OrderSatausEnum(Integer orderStatus,String orderSatausDes) {
        this.orderStatus = orderStatus;
        this.orderSatausDes = orderSatausDes;
    }
    
    // get set
}

进一步,如果订单某天要加个“待拼团”状态咋办?所以这些配置化的东西,可以上配置中心。比如携程出的 apollo 等

3. OOP 规则

【书摘】Object 的 equals 方法容易抛空指针异常,应使用常量或者确定优质的对象来调用 equals 。

比如:“TO_PAY”.equals(order.getOrderStatus())。反着写就不对了,因为 order.getOrderStatus() 可能为 null。

自然,更加推荐 java.util.Objects#equals 工具类。

【书摘】所有相同类型的包装类对象之间的值比较,全部使用 equals 方法。

小思考:别用 == 了。equals 也要注意些事情,比如 Byte 类型的 status 对象值,用 equals 要注意如下:

getStatus().equals(0) // 反例,false
getStatus().equals((byte)0) // 正例,true

还有, == 比如 Integer 在 -128 到 127 范围比较正常,超过就不正常。原因是 -128 到 127 范围的对象在 IntegerCache.cache 中产生,会复用对象。所以所以,切记切记,别用 == 了,用 equals 去比较。

4. 集合处理

【书摘】不要在 for 循环中进行元素的 remove/add 操作。remove 请使用 Iterator 方法,如果有并发操作,则对 Iterator 对象加锁。

具体 Iterator 怎么操作集合,百度下即可。这还是典型的 迭代器设计模式,可以深入源码看看人家的简单实现原理,又能学到一发高级知识。

5. 并发处理

【书摘】第一,线程必须通过线程池来提供,不允许显式创建线程。第二,线程池不允许用 Executors 创建,应使用 ThreadPoolExecutor 去创建。因为
Executors 创建的几种 ThreadPool 会有弊端:

  • FixedThreadPool 和 SingleThreadPool 允许请求队列长度为 Integer.MAX_VALUE ,大量请求,会导致 OOM
  • CachedThreadPool 和 ScheduledThreadPool 允许创建最大的线程数为 Integer.MAX_VALUE,大量创建线程,会导致 OOM

所以,使用 ThreadPoolExecutor 的原因是能更好地理解线程池的运行规则,规避资源耗尽,更好地贴合某个业务场景,去创建更适合的线程池。


【书摘】在高并发场景中,同步调用应该考虑锁的性能损耗。能用无锁数据结构,就不要用锁;能锁区块,就不要锁整个方法体;能用对象锁,就不要用类锁。即,加锁的粒度越小,性能损耗越小。并且避免锁的代码块中调用了 RPC 方法。

另外,同时对多个资源加锁的时候,需要保持一致的加锁顺序。否则,一个线程加锁顺序为 ABC,另一个加锁顺序为 ACB 或 BAC 等,会造成死锁。如图:

file


【书摘】金融资金相关信息,使用悲观锁。比如更新某个用户的钱包余额字段。

小思考:我以前做 P2P 的时候,就很简单地使用了 MySQL 的行锁。

SELECT * FROM xx WHREER xx.id=888 FOR UPDATE

具体行锁,表锁大家可以自行百度了解。

6. 控制语句

【书摘】高并发场景,比如秒杀场景,商品扣库存,库存的判断不要用“等于”来判断商品库存已售罄的条件。应使用大于或者小于的条件来代替。

小思考:这是典型的超卖场景。有人会问也会存在超卖几件的问题吧?答案是是的。但如果用 等于 来判断,超卖的件数会很多很多,比如达到 1 万件。但超卖 1 万件和超卖 1 件是不一样等级的故障。或者是一个故障和一个不是故障的区别。

7.异常处理

【书摘】异常不要用来做流程控制,条件控制

小思考:昨天京东小哥问我,这个能这么搞降级吗?如下代码:

try {
    searchFromES()
}catch(){
    searchFromDB()
}

这不算降级,这也不能这么搞。第一,代码这也写就不对,异常不要用来做流程控制,条件控制。第二,这个只要实现 ES 读取有问题,读取不到就读 DB。可以考虑责任链设计模式去实现。伪代码如下:


ESHandle {
    void handle() {
        try {
            searchFromES()
        }catch(){
        }
    }
}

DBHandle {
    void handle() {
        try {
            searchFromES()
        }catch(){
        }
    }
}

// 两个 Handle 利用责任链去实现即可。

8. 建表规约 、SQL 语句

【书摘】当单表行数超过 500 万行或者单表容量超过 2 GB时,才推荐进行分库分表。

如果预计三年后的数量级无法达到这个级别,请不要在创建表时就分库分表。


【书摘】不要使用 count(列名) 或者 count(常量) 来替代 count(*)。 因为它是 SQL92 定义的标准统计行数的预发。它会统计 NULL 的行。


【书摘】where 条件下里面的 in 能避免就避免,要注意 in 里面的集合数量,控制在 1000 个之内。


【书摘】在代码中写分页查询,如果 count 为 0 ,直接返回 空列表。避免执行下面的分页语句。

9.服务器

【书摘】高并发服务器建议调小 TCP 协议的 time_wait 超时时间。Linux 修改 /etc/sysctl.conf 文件,代码如下:

net.ipv4.tcp_fin_timeout = 30

【书摘】JVM 设置参数 -XX:+HeapDumpOnOutOfMemoryError。让 JVM 碰到 OOM 的时候,输出 dump 信息。

小思考:这个很重要。二者得保留事故服务器现场。比如 OOM 了某个服务器,则在 VIP 或者啥摘到该机器,让该机器不再有请求进入。然后去查看 dump 信息,去排查 OOM 问题。

工程师对于代码,一定要精益求精,不论从性能,还是简洁优雅,都要具备精益求精的工匠精神,认真打磨自己的作品。
-- 多隆

本文由博客群发一文多发等运营工具平台 OpenWrite 发布
查看原文

赞 2 收藏 2 评论 0

程序员泥瓦匠 发布了文章 · 2020-09-30

博客导流公众号 阅读全文工具

一、阅读全文工具

如何进入 工具 页面:

file

二、如何使用?

使用帮助:「配置页面」->「添加博客」->「添加脚本」

  • OpenWrite 微信公众号增长神器 "ReadMore" 简介
  • "ReadMore" 之 WordPress 博客使用指南
  • "ReadMore" 之 Hexo 博客使用指南
  • "ReadMore" 之 Solo 博客使用指南

博客列表 / 添加博客
博客信息
Blog 名称
例如:OpenWrite 最懂你的科技自媒体工具平台
Blog 域名
例如:https://openwrite.cn
微信公众号信息
公众号名称
例如:OpenWrite
公众号二维码图片
例如:https://openwrite.cn/images/w...
获取验证码关键词
例如:more
请如实填写您想要导流的博客和公众号信息,我们将为您自动生成辅助工具!

原文链接:https://openwrite.cn/openwrite/%e5%8d%9a%e5%ae%a2%e5%af%bc%e6%b5%81%e5%85%ac%e4%bc%97%e5%8f%b7-%e9%98%85%e8%af%bb%e5%85%a8%e6%96%87%e5%b7%a5%e5%85%b7/

三、ReadMore的效果

整合后的博客文章内容将自动隐藏一半,同时显示“阅读全文”按钮(重点:虽然隐藏,但只是视觉上的,并不影响SEO):

点击“阅读全文”按钮,自动弹出引导关注公众号的话术:

通过关注获得二维码,读者就可以轻松解锁文章的阅读。

在这之后你的自然增长就源源不断了,下面你就可以核心关注两件事就可以了:

  1. 更多优秀的内容创作,并首发到自己的博客
  2. 使用OpenWrite扩散给其他平台的读者,并推荐自己的博客

就这样,ReadMore为你轻松开启躺增粉丝的生活~

本文由博客群发一文多发等运营工具平台 OpenWrite 发布
查看原文

赞 0 收藏 0 评论 0

认证与成就

  • 获得 467 次点赞
  • 获得 3 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 3 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

注册于 2019-03-26
个人主页被 5.5k 人浏览