一、微服务
1.1 服务架构演变
1.1.1 单体架构
单体应用架构被认为是构建应用程序的传统架构方式,它是作为一个不可分割的单元构建的。统一部署,把所有的功能单元放在一个应用里。然后把整个应用部署到一台服务器上。如果负载能力不行,将整个应用进行水平复制,进行扩展,然后通过负载均衡实现访问。
这样易于开发和测试,也十分方便部署;当需要扩展时,只需要将war复制多份,然后放到多个服务器上,再做个负载均衡就可以了。
但如果某个功能模块出问题,有可能全站不可访问,修改Bug后、某模块功能修改或升级后,需要停掉整个服务,重新整体重新打包、部署这个应用war包,功能模块相互之间耦合度高,相互影响,不适合当今互联网业务功能的快速迭代。特别是对于一个大型应用,我们不可能把所有内容都放在一个应用里面,我们如何维护、如何分工合作都是问题。如果项目庞大,则管理难度大。
- Java实现:JSP、Servlet,打包成一个jar、war部署
- Web应用服务器:开源的tomcat、jetty、glassfish。商用的有weblogic、websphere、Jboss
1.1.2 SOA
SOA(Service Oriented Architecture,面向服务的架构)是由多个服务组成的分布式系统。各个子系统之间没有采用统一的通信标准,导致系统间通信与数据交互变得异常复杂。
各个服务之间通过ESB(Enterprise Service Bus,企业服务总线)进行通信,ESB是一个由大量规则和原则集成的软件架构,可以将一系列不同的应用程序集成到单个基础架构中,由于没有好的开源方案,只能使用商业公司的产品,因此成本很高。此外ESB属于重量级产品,部署规划异常笨重。
1.1.3 微服务
参考https://www.martinfowler.com/microservices/
微服务架构风格是一种将单个应用程序开发为一套小型服务的方法,每个服务都在自己的进程中运行并与轻量级机制(通常是 HTTP 资源 API)进行通信。这些服务围绕业务功能构建,并可通过全自动部署机制独立部署。对这些服务进行最低限度的集中管理,这些服务可能用不同的编程语言编写并使用不同的数据存储技术。
微服务属于SOA的子集,SOA可以认为面向服务的1.0版本,微服务可以认为是面向服务的2.0版本。微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底消除强耦合,每一个微服务提供单个业务功能,一个服务只做一件事。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境。常见的微服务框架包括Dubbo和Spring Cloud。
1.2 单体应用和微服务的比较
1.2.1 单体架构
1.2.1.1 优点
- 上手容易,学习成本低,通常技术栈比较简单。
- 易于部署,单体应用部署的复杂度要比微服务低得多。
- 适合小型团队开发“小而美”的、对业务复杂度不高、对应用扩展能力要求不高的应用程序架构。
1.2.1.2 缺点
- 随着应用需求的增加以及规模的扩大,由于其代码耦合度高,单体应用自身的代码复杂度会很高,从而变得难以维护。具体表现为修改任何一处细节的代码,都会影响整个系统。因此必须全面协调开发、测试、部署。这使得软件迭代变的很慢,交付的效率低。
- 扩展性差:很难去针对某个模块进行扩展,只能针对整个应用程序扩展。IO密集型和计算密集型模块混合在一起,无法独立升级及扩容。
- 新技术壁垒:在单体应用程序中应用新技术极其困难,因为这样就必须重写整个应用程序。
1.2.2 微服务
1.2.2.1 优点
- 每个服务足够小,代码容易理解。这样能聚焦一个简单唯一的业务功能或业务需求。
- 开发简单、开发效率提高,一个服务可能就是专业的只干一件事,微服务能够被小团队单独开发,这个小团队可以是2到5人的开发人员组成。微服务只需开发人员更专注于与业务相关的特定服务即可。
- 微服务是低耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的。
- 微服务能使用不同的语言开发。
- 易于和第三方集成,微服务运行容易且灵活的方式集成自动部署,通过持续集成工具,如Jenkins。
- 每个微服务都有自己的存储能力,一般都有自己的独立的数据库,也可以有统一数据库。
1.2.2.2 缺点
- 微服务把原有的一个项目拆分成多个独立工程,增加了开发、测试、运维、监控等的复杂度。
- 微服务架构需要保证不同服务之间的数据一致性,引入了分布式事务和异步机制,为设计和开发带来一定挑战。
- 微服务适用于复杂的大系统,对于小型应用使用微服务,进行盲目的拆分只会增加其维护和开发成本。
二、Dubbo
2.1 Dubbo介绍
Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK(Software Development Kit,软件开发工具包)实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力,利用 Dubbo 提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo 被设计为高度可扩展,用户可以方便的实现流量拦截、选址的各种定制逻辑。
在云原生时代,Dubbo 相继衍生出了 Dubbo3、Proxyless Mesh 等架构与解决方案,在易用性、超大规模微服务实践、云原生基础设施适配、安全性等几大方向上进行了全面升级。
Apache Dubbo 提供了六大核心能力:面向接口代理的高性能RPC调用、智能容错和负载均衡、服务自动注册和发现、高度可扩展能力、运行期流量调度、可视化的服务治理与运维。
Dubbo官网:https://cn.dubbo.apache.org/zh-cn/
节点角色说明
节点 | 角色说明 |
Provider | 暴露服务的服务提供方 |
Consumer | 调用远程服务的服务消费方 |
Registry | 服务注册与发现的注册中心(eg:Zookeeper) |
Monitor | 统计服务的调用次数和调用时间的监控中心 |
Container | 服务运行容器 |
调用关系说明
1. 服务容器负责启动,加载,运行服务提供者。
2. 服务提供者在启动时,向注册中心注册自己提供的服务。
3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
中心类型 | 开源组件 | EDAS(Enterprise Distributed Application Service)组件 | 托管说明 |
注册中心 | Nacos(推荐)、ZooKeeper(推荐)、etcd、Consul、Eureka | Nacos(推荐)、EDAS注册中心 | 只需将应用部署到 EDAS 中,即可默认接入注册中心 |
配置中心 | Nacos(推荐)、ZooKeeper(推 荐)、Apollo | Nacos(推荐) | 只需将应用部署到EDAS中,即可默认接入配置中心 |
元数据中心 | Nacos(推荐)、Redis(推荐)、 ZooKeeper | Nacos(推荐) | 您只需将应用部署到EDAS中,即可默认接入元数据中心。 |
EDAS(Enterprise Distributed Application Service):企业级分布式应用服务
Dubbo服务框架的工作流程如下:
1. 服务提供者在启动时,在注册中心注册服务。
2. 服务消费者在启动时,在注册中心订阅所需的服务。
3. 注册中心返回服务提供者地址列表给服务消费者。如果服务提供者发生变更,注册中心将推送变更数据给服务消费者。
4. 服务消费者基于软负载均衡算法,从服务提供者地址列表中选一个服务提供者进行调用。
2.2 实现Dubbo微服务架构
2.2.1 环境准备
IP | 主机名 | 作用 |
192.168.131.11~13 | zk1~3 | Zookeeper(注册中心) |
192.168.131.14 | provider | Provider(提供者) |
192.168.131.15 | consumer | Consumer(消费者) |
192.168.131.16 | node6 | dubbo-admin |
默认provider会利用DNS解析自已的主机名为IP,导致provider地址错误,可以想方法让DNS无法解析本机主机名或者为本机IP解决此问,可以如下方法解决:
- 将provider主机名修改为localhost.localdomain或都任意无法解析的主机名,确保本机主机名无法解析。
- 修改所有provider主机的/etc/hosts文件,添加一行 <provider服务器地址> 本机主机名,确保本机主机名正确解析为本机IP。
- 修改所有consumer主机的/etc/hosts文件,添加一行 <consumer服务器地址> 本机主机名,确保本机主机名正确解析为本机IP,这项是dubbo-admin所需。
- 修改网卡配置文件/etc/netplan/01-netcfg.yaml,删除此行search: [xxx],确保本机主机名无法解析。
主机解析配置如下:
cat /etc/hosts
192.168.131.11 zk1.wang.org
192.168.131.12 zk2.wang.org
192.168.131.13 zk3.wang.org
192.168.131.14 provider
192.168.131.15 consumer
2.2.2 部署Zookeeper
参考https://blog.51cto.com/u_15796303/6193455
2.2.3 在Provider和Comsumer安装maven并镜像加速
具体参考https://blog.51cto.com/u_15796303/10010762
2.2.4 Provider和Consumer主机解析Zookeeper地址
cat dubbo-server/src/main/java/config.properties
dubbo.registry=zookeeper://zk1.wang.org:2181?backup=zk2.wang.org:2181,zk3.wang.org:2181
dubbo.port=20880
2.2.5 编译Dubbo Provider和Consumer
#编译Provider
root@provider:~# tar -xf dubbo-demo-provider.tar.gz
root@provider:~# cd dubbo-demo-provider/
root@provider:~/dubbo-demo-provider# mvn clean package -Dmaven.test.skip=true
#编译Consumer
root@consumer:~# tar -xf dubbo-demo-consumer.tar.gz
root@consumer:~# cd dubbo-demo-consumer/
root@consumer:~/dubbo-demo-consumer# mvn clean package -Dmaven.test.skip=true
2.2.6 启动Dubbo Provider和Consumer
先启动Provider,再启动Consumer
java -jar dubbo-server/target/dubbo-server.jar
java -jar dubbo-client/target/dubbo-client.jar
访问效果如下:
#consumer显示下面日志
HelloAction接收到请求:wang
HelloService返回到结果:<h1>这是Dubbo 消费者端(springboot)</h1><h2>Dubbo微服务!</h2>hello wang
#provider显示下面日志
HelloService接收到消息:wang
2.3 编译安装Dubbo的Web管理Dubbo Admin
Dubbo Admin提供了可视化界面,用来观察微服务中的互相调用关系。
官方说明:https://github.com/apache/dubbo-admin
当前项目已经用golang重构,需要下载指定branch为develop,再用downlaod zip 形式下载JAVA的源代码。
2.3.1 编译dubbo admin
#下载
wget https://github.com/apache/dubbo-admin/releases/download/0.5.0/apache-dubbo-admin-0.5.0-bin-release.tar.gz
#解压
tar -xf apache-dubbo-admin-0.5.0-bin-release.tar.gz
#修改Zookeeper地址为实际IP
cd apache-dubbo-admin-0.5.0-bin-release/bin/config && vim application.properties
admin.registry.address=zookeeper://192.168.131.11:2181,192.168.131.12:2181,192.168.131.13:2181
admin.config-center=zookeeper://192.168.131.11:2181,192.168.131.12:2181,192.168.131.13:2181
admin.metadata-report.address=zookeeper://192.168.131.11:2181.192.168.131.12:2181,192.168.131.13:2181
2.3.2 启动dubbo admin
cd .. && sh startup.sh
查看日志
2.3.3 登录Web界面验证
浏览器访问下面地址,用登录名和密码均为root去登录:http://dubbo-admin IP:8080