【Chris Richardson 微服务系列】服务发现的可行方案以及实践案例

【Chris Richardson 微服务系列】服务发现的可行方案以及实践案例

编者的话 本文来自 Nginx 官方博客,是微服务系列的第四篇文章。第一篇介绍了微服务架构的模式,讨论了使用微服务架构的优缺点;第二篇和第三篇描述了微服务架构内部的通讯机制。这篇文章中,我们将会探讨服务发现。
作者介绍Chris Richardson,是世界著名的软件大师,经典技术著作《POJOS IN ACTION》一书的作者,也是 cloudfoundry.com 最初的创始人,Chris Richardson 与 Martin Fowler、Sam Newman、Adrian Cockcroft 等并称为世界十大软件架构师。Chris Richardson 微服务系列全 7 篇
1.微服务架构概念解析2.构建微服务架构:使用 API Gateway3.深入微服务架构的进程间通信4. 服务发现的可行方案以及实践案例(本篇文章5.微服务的事件驱动数据管理6.选择微服务部署策略7.将单体应用改造为微服务

为什么要使用服务发现

假设我们写的代码会调用 REST API 或者 Thrift API 的服务。为了完成一次请求,代码需要知道服务实例的网络位置(IP 地址和端口)。运行在物理硬件上的传统应用中,服务实例的网络位置是相对固定的;代...阅读全文
【Chris Richardson 微服务系列】微服务架构中的进程间通信

【Chris Richardson 微服务系列】微服务架构中的进程间通信

编者的话 本文来自 Nginx 官方博客,是微服务系列文章的第三篇,在第一篇文章中介绍了微服务架构模式,与单体模式进行了比较,并且讨论了使用微服务架构的优缺点。第二篇描述了采用微服务架构的应用客户端之间如何采用 API 网关方式进行通信。在这篇文章中,我们将讨论系统服务之间是如何实现通信的。
作者介绍Chris Richardson,是世界著名的软件大师,经典技术著作《POJOS IN ACTION》一书的作者,也是 cloudfoundry.com 最初的创始人,Chris Richardson 与 Martin Fowler、Sam Newman、Adrian Cockcroft 等并称为世界十大软件架构师。Chris Richardson 微服务系列全 7 篇
1.微服务架构概念解析2.构建微服务架构:使用 API Gateway3. 深入微服务架构的进程间通信(本篇文章4.服务发现的可行方案以及实践案例5.微服务的事件驱动数据管理6.选择微服务部署策略7.将单体应用改造为微服务

简介

在单体应用中,各模块之间的调用是通过编程语言级别的方法或者函数来实现的。而基于微服务的分布式应用是运行在多台机器上的;一般来说,每个服务实例都是一个进...阅读全文
【Chris Richardson 微服务系列】使用 API 网关构建微服务

【Chris Richardson 微服务系列】使用 API 网关构建微服务

编者的话 本文来自 Nginx 官方博客,是微服务系列文章的第二篇,本文将探讨:微服务架构是如何影响客户端到服务端的通信,并提出一种使用 API 网关的方法。
作者介绍Chris Richardson,是世界著名的软件大师,经典技术著作《POJOS IN ACTION》一书的作者,也是 cloudfoundry.com 最初的创始人,Chris Richardson 与 Martin Fowler、Sam Newman、Adrian Cockcroft 等并称为世界十大软件架构师。Chris Richardson 微服务系列全 7 篇
1.微服务架构概念解析2. 构建微服务架构:使用 API Gateway(本篇文章3.深入微服务架构的进程间通信4.服务发现的可行方案以及实践案例5.微服务的事件驱动数据管理6.选择微服务部署策略7.将单体应用改造为微服务

简要概述

让我们想象一下,你要为一个购物应用程序开发一个原生移动客户端。你很可能需要实现一个产品详情页面,展示任何指定商品的信息。下图展示了 Amazon Android 应用在商品详情页显示的内容。即使只是个智能手机应用,产品详情页面也显示了大量的信息。该页面不仅包含基...阅读全文
【Chris Richardson微服务系列】微服务架构的优势与不足

【Chris Richardson微服务系列】微服务架构的优势与不足

编者的话|本文来自 Nginx 官方博客,是微服务系列文章的第一篇,主要探讨了传统的单体式应用的不足,以及微服务架构的优势与挑战。
作者介绍Chris Richardson,是世界著名的软件大师,经典技术著作《POJOS IN ACTION》一书的作者,也是 cloudfoundry.com 最初的创始人,Chris Richardson 与 Martin Fowler、Sam Newman、Adrian Cockcroft 等并称为世界十大软件架构师。微服务在当下引起广泛关注,成为文章、博客、社交媒体讨论和大会演讲的热点;在 Gartner 的 “Hype Cycle” 上排名也非常靠前。与此同时,在软件社区也有人质疑微服务并非新事物。反对者认为微服务只是 SOA (Service Oriented Architecture)的二度包装。然而,无论是追捧还是质疑,微服务架构拥有巨大优势,尤其是它让敏捷开发和复杂的企业应用交付成为可能。本系列包含 7 篇文章,介绍了微服务的设计、构建和部...阅读全文
互联网广告实时竞价流程以及术语

互联网广告实时竞价流程以及术语

首先,你要对互联网广告的产业链至少有一个基本的了解。
  • 广告主(advertiser
显然是指想要为自己的品牌或者产品做广告的人,例如:宝马,intel,蒙牛等等,简单说就是需求方。
  • 媒体(publiser
媒体是指提供广告位的载体,例如:电视台,网站,杂志,app应用,简答说就是供应方。
  • 广告商(agency
本质上其实就是中介,帮广告主找媒体广告位,帮媒体找广告主。
  • 受众(audience
这个产业链还有一个不能忽视的部分,那就是“消费”广告的人搞清了产业链,让我们来了解广告的一些基础知识概念RTB(Real Time Bidding也就是“实时竞价”,是现代互联网广告行业中新兴起的一种流量交易方式,有以下几个显著的不同于传统互联网广告的特点
  1. 在用户刚打开流量的载体(App或是Wap站点)的时候,该广告位要显示的东西还尚未确定,只有当竞价结束的时候,才会最终确定实际被展示的内容(Creative)。
  2. 竞价时间非常短,一般100ms之内就要完成,所以对参与各方的技术要求很高
  3. 完全以CPM计价

RTB的优势...

阅读全文
golang使用vendor目录来管理依赖包

golang使用vendor目录来管理依赖包

最新的go推荐使用go mohttp://www.gaoxuan1989.com/2019/07/19/using-go-mod/

Vendor目录介绍

随着Go 1.5 release版本的发布,vendor目录被添加到除了GOPATHGOROOT之外的依赖目录查找的解决方案。在Go 1.6之前,你需要手动的设置环境变量GO15VENDOREXPERIMENT=1才可以使Go找到Vendor目录,然而在Go 1.6之后,这个功能已经不需要配置环境变量就可以实现了。
Note,即使使用vendor,也必须在GOPATH中,在go的工具链中,你逃不掉GOPATH
那么查找依赖包路径的解决方案如下
  • 当前包下的vendor目录。
  • 向上级目录查找,直到找到src下的vendor目录。
  • GOPATH下面查找依赖包。
  • GOROOT目录下查找

一些建议

在使用vendor中,给出如下建议
  1. 一个库工程(不包含main的package)不应该在自己的版本控制中存储外部的包在vendor\目录中,除非他们有特殊原因并且知道为什么要这么做。
  2. 在一个应用中,(包含main的package),建议只有一个vendor目录在代码库一级目录。
上面建议的原因如下
  • 在目录结构中的每个包的实例,即使是同一个包的同一个版本,都会打到最终的二进制文件中,如果每个人都单独的存储自己的依赖包,会迅速导致生成文件的二进制爆发binary bloa
  • 在一个目录的某个pacage类型,并不兼容在同一个package但是在不同目录的类型,即便是同一个版本的package,那意味着loggers,数据库连接,和其他共享的实例都没法工作。

举个例子

工程目录如下
- $GOPATH/src/github.com/mattfarina/golang-broken-vendor- foo.go- vendor/   - a/   - b/       - vendor/a/
在这个例子中,两个apackage都是完全一样的,b package在代码库中保存了a package,在顶级应用代码中也引用了a包。文件foo.go做了很简单的事情:
funmai() vai.i"foo".Di
那么问题来了,当我们build的时候,发现出问题了,返回了下面的错误
$ GO15VENDOREXPERIMENT=1 go build./foo.go:12: cannot use it (type "github.com/mattfarina/golang-broken-vendor/vendor/a".A) as type "github.com/mattfarina/golang-broken-vendor/vendor/b/vendor/a".A in argument to b.Do
你可以clone这个测试...阅读全文
Centos升级php5.3到php5.6

Centos升级php5.3到php5.6

在玩wordpress添加插件的时候,发现有的插件必须要php5.5才能支持,原来使用yum安装了php5.3,所以索性升级到php5.6好了,网上找了一下,下面这个方法可以解决我的问题,贴在这里和大家分享一下。

查看并删除原有的php5.

查看原有php的版本查看已经安装的php包可以看到如下原有的安装包全都是5.3.3-38.el6版本的,如果不删除原有的5.3的包,安装php5.6的包的时候会报冲突的错误。删除5.3的包删除后可以确认一下是否已经完成删除结果应该是空。

安装php5.6的包

由于centos 6.*原有的rpm中不包含5.6的包的资源,所以需要先安装导入PHP的安装源然后安装php 5.6相关的包全部安装成功后确认一下结果如下
php56w.x86_64            5.6.27-1.w6    @webtaticphp56w-cli.x86_64        5.6.27-1.w6    @webtaticphp56w-common.x86_64     5.6.27-1.w6    @webtaticphp56w-gd.x86_64         5.6.27-1.w6    @webtaticphp56w-ldap.x86_64       5.6.27-1.w6    @webtaticphp56w-mbstring.x86_64   5.6.27-1.w6    @webtaticphp56w-mysql.x86_64      5.6.27-1.w6    @webtaticphp56w-odbc.x86_64       5.6.27-1.w6    @webtaticphp56w-pdo.x86_64        5.6.27-1.w6    @webtaticphp56w-soap.x86_64       5.6.27-1.w6    @webtaticphp56w-xml.x86_64        5.6.27-1.w6    @webtaticphp56w-xmlrpc.x86_64     5.6.27-1.w6    @webtatic
重启php-fpm:执行:应当显示5.6。ok升级完毕!阅读全文
深入了解gRPC:协议

深入了解gRPC:协议

gRPC 是基于 HTTP/2 协议的,要深刻理解 gRPC,理解下 HTTP/2 是必要的。本篇文章会先简单介绍一下 HTTP/2 相关的知识,然后再介绍下 gRPC 是如何基于 HTTP/2 构建的。

HTTP/1.

HTTP 协议可以算是现阶段 Web 上面最通用的协议了,在之前很长一段时间,很多应用都是基于 HTTP/1.x 协议,HTTP/1.x 协议是一个文本协议,可读性非常好,但其实并不高效,笔者主要碰到过几个问题

parse

如果要解析一个完整的 HTTP 请求,首先我们需要能正确的读出 HTTP header。HTTP header 各个 fields 使用\r\n分隔,然后跟 body 之间使用\r\n\r\n分隔。解析完 header 之后,我们才能从 header 里面的content-length拿到 body 的 size,从而读取 body。这套流程其实并不高效,因为我们需要读取多次,才能将一个完整的 HTTP 请求给解析出来,虽然在代码实现上面,有很多优化方式,譬如
  • 一次将一大块数据读取到 buffer 里面避免多次 IO rea
  • 读取的时候直接匹配 \r\n 的方式流式解析
但上面的方式对于高性能服务来说,终归还是会有开销。其实最主要的问题在于,HTTP...阅读全文
Linux程序员都需要知道的bash shell快捷键

Linux程序员都需要知道的bash shell快捷键

作为经常在linux开发的程序员,bash shell使用必不可少,熟记下面的快捷键,将极大地提高你的工作操作效率。

使用快捷键编辑命令行是由GNU Readline Library提供的。这些库被许多其他*nix应用包括bash使用,所以学习这些快捷键不仅可以让你很容易地在bash命令中操作,还能让你在一系列使用Readline的*nix应用中更方便的操作,默认情况下,Readline使用emacs键映射,尽管可以设置成vi编辑模式,我还是倾向于学习默认的操作,因为大多数应用是这样的。

编辑命令

  • Ctrl + a - 移到命令行首
  • Ctrl + e - 移到命令行尾
  • Ctrl + k - 从光标处删除至命令行尾
  • Ctrl + u - 从光标处删除至命令行首
  • Ctrl + w - 从光标处删除至字首(比如删除一个单词
  • Ctrl + y - 粘贴刚才上面使用过的删除快捷键删除的单词或文本到光标后面
  • Ctrl + xx - 在命令行首和光标之间来回移动
  • Alt + b -按单词后移(左向
  • Alt + f - 按单词前移(右向
  • Alt + d - 从光标处删除至字尾
  • Alt + c - 从光标处更改为首字母大写的单词
  • Alt + u -从光标处更改为全部大写的单词
  • Alt + l - 从光标处更改为全部小写的单词
  • Alt + t - 交换光标处和之前的单词
  • Ctrl + f - 按字符前移(右向
  • Ctrl + b - 按字符后移(左向
  • Ctrl + d - 删除光标处的字符...
阅读全文
nginx如何通过客户端ip分流

nginx如何通过客户端ip分流

开发者有时候需要将部分客户端流量分流到其他web服务,比如灰度环境,又或者分流到某个特定的URL。根据用户访问的ip地址,理想情况是根据地理位置分流,又或者只是简单的想防止特定ip地址的访问我们某个路径。那么,我们怎么将客户端ip为1.2.3.4分流到httpwww.gaoxuan1989.com/page1.html,并且将剩余的流量分到http://www.gaoxuan.com1989/otherpage.html,接下来我们就来讨论这个问题。

通过Nginx HttpAccessModule分发流量

由于Nginx支持条件判断,所以首先我们先看一个例子:如何使用HttpAccessModule的变量$remote_addr来分发流量。
servei($remote_add= 1.2.3.4rewrithtt://www.gaoxuan1989.com/otherpage.html;
这个例子就可以将1.2.3.4的这个ip地址转发到我们预先设定的地址了。

假如我们使用nginx作为Apache或者其他web容器的前端代理呢?

这种场景我们基本不用怎么改,只是将流量通过proxy_pass转发到后端服务就好了:
i($remote_add= 1.2.3.4proxy_pashtt://www.gaoxuan1989.com/...
阅读全文