巧房微服务架构实战

微风

2019/03/24 发布于 技术 分类

文字内容
1. 巧房微服务实战面面观 巧房科技 / 刘朝刚
3. • • • • • 背景 系统架构 持续集成/持续发布 典型问题剖析 未来规划
4. 背景
5. 业务背景 u 巧房主要是为房产中介经纪人提供一个安全、稳定、高效、智能的 SAAS平台,主要涵盖如下几块功能:房源管理、客源管理、交易管 理、财务管理、人事OA、运营分析等功能。 u 目前服务4000多家房产中介公司,30W房产经纪人,分布在全国20 多个省份,100多个城市。当前有上海、广州两个IDC机房作为两个分 区并在阿里云上面搭建了第三个分区。
6. 单体架构 Tomcat 房源管理 客源管理 交易管理 财务管理 人事OA 运营分析
7. 技术挑战 开发上线成本高周 期长 牵一发而动全身 系统扩展、架构演 进难度大成本高 应用扩容成本 高、效率低 微服务
8. 系统架构
9. 技术选型 Spring Cloud Kubernetes p 组件丰富,兼容性好 p 管理维护docker,功能强大 p 开发部署,简单快速 p 超强的扩容、缩容能力 p 系统组件, 扩展性强 p 系统稳定,容错能力强 基于Spring Cloud和Kubernetes的微服务系统
10. 微服务1.0架构核心 微服务1 Feign Ribbon Hystrix 调用 微服务2 Feign Ribbon Hystrix 微服务1 Docker 微服务2 Docker Eureka Kubernetes Eureka Docker n 最大限度地实现解耦,开发 效率大大提升、部署上线简 单快速。 n 各个微服务高内聚,各司其 职,接口设计更加轻量、合 理。 n 降低了整个服务器的成本, 扩容缩容简单易用
11. 微服务1.0架构不足 n 服务上线与下线,调用服务需要一段时间后才从自己 缓存的服务列表中移除。 n 在客户端做负载均衡,对开发来说需要感知,且微服 务有点重。 n 无法兼容与使用Kubernetes在微服务运维与监控方面 做的很好的一些功能,比如扩容缩容,灰度发布等 等。
12. 微服务2.0架构核心 Service1 Feign Ribbon Hystrix http://service2/abc/def Service2 KubeDNS KubeProxy Pod1 Feign Ribbon Hystrix Pod2 Feign Ribbon Hystrix n 相对于之前的客户端负载均 衡来说,这是典型的服务端 负载均衡,此时客户端非常 轻量,只做业务的处理。 n 使用Kubernetes代替 Eureka做服务治理。 n 继续使用Spring Cloud中的 其他组件,原来配置name 来访问其他组件的地方,全 部换成使用url来访问。
13. 客户端 DNS Nginx ︵ 架 构 总 览 图 ︶ K8S平台 反向代理 服务网关层 网关1(zuul) 配置中 KubeDNS+ 服务BFF层 心 KubeProxy (Spring 服务BFF1 Cloud Config) 网关2(zuul) KubeDNS+KubeProxy 监控平台 服务BFF2 KubeDNS+KubeProxy Kafka 底层服务层 Git Redis 底层服务1 底层服务2 底层服务3 底层服务4 RabbitMQ ES 日志平台 LTS
14. Node Kubernetes ︵ ︶ Master Kube-dns Apiserver Docker Kube-proxy Kubedashboard Kubeschedule Kubecontrollermanager Etcd Flannel Kubelet Kubeproxy Docker Flannel Node Kubelet Kubeproxy Docker Flannel
15. 架构详解~配置中心 Service1 调 用 Service2 调 用 Config Server GitLab common-online 获取配置 config-repo service1-online.yml online n n application.yml service2-online.yml SearchPath中定义两个路径,分别存放服务具体配置与公共配置。 优先使用文件名与服务名完全一致的配置文件,如果没有再去 application*.yml中查找并使用找到的配置值。
16. 架构详解~服务网关 Gateway Token认证 UserCenter 服务路由 gateway-online.yml zuul: routes: service1bff-route: url: http://service1bff:8080 path: /api/service1bff/** 1. 服务路由:配置时 指定url,服务端负 载均衡找到bff 2. Token认证:Filter 中调用用户中心验 证token
17. 架构详解~服务调用(1) Service1 TestClient Service2 TestFacade 调用接口 public interfaceTest1Facade { @FeignClient(url="${feign.url. public testabc(request); service1}") } public interface TestClient { @RequestMapping(value = 实现接口 "/testabc") Service2 TestFacadeImpl public testabc(); public class Test1FacadeImpl { } @RequestMapping(value = "/testabc") public testabc(request){//实现代码} }
18. 架构详解~服务调用(2) Service2 TestFacade Service1 依赖service2 接口jar包 @FeignClient(url="${feign.url.service1}") public interfaceTest1Facade { @RequestMapping(value = "/testabc") 调用 public testabc(request); service2接口 } 实现接口 Service2 TestFacadeImpl public class Test1FacadeImpl { public testabc(request){//实现代码} }
19. 架构详解~服务调用(3) Service1 Service2-Stub 依赖 发布 Nexus 获取stub.jar 调用 appliaction.yml Service2Impl Service1 获取配置 feign: url: service1: http://service2:8080
20. 架构详解~日志处理(1) 异常报警 关键字 服务负责 人映射 微服务1 生成 日志 微服务2 Kafka 消费 日志 Storm 发送 报警 消费 日志 Elastic Search 查询 数据 Log Service 钉钉
21. 架构详解~日志处理(2)
22. 持续集成/持续发布
23. CICD – 代码分支管理 Develop Master Feature1 Tag1.0.1 Hotfix1.0 Feature2 Tag1.0.2
24. CICD ︵ ︵ 流 程 图 ︶ Local Git Commit消息 Gitlab 校验 IDE 单元测试 增量代码静态检查 拉取代码 代码静态检查 Kubernetes 合并 代码 Harbor Sonar Qube Jenkins 单元测试 Dev 部署镜像 Dev 生成镜像 Dev 全量代码静态检查 单元测试 Test 部署镜像 Test 生成镜像 Test 拉取镜像 UAT 部署镜像 UAT 触发 UAT 拉取镜像 Online 部署镜像 Online 触发 Online 全量代码静态检查
25. 典型问题分析
26. 服务拆分错了怎么办(1) 服务1 Start子服务 子服务a 子服务b Facade-stub Facade Service Cache Dao Facade-stub Facade Service Cache Dao Jvm内部调用
27. 服务拆分错了怎么办(2) 服务1 Start子服务 子服务a Facade-stub Facade Service Cache Dao Feign调用 服务b Facade-stub Facade Service Cache Dao
28. 数据库连接不够问题(1) 单体:20(连接数)*10 (服务实例数)*1(服务数 量)*100(公司数) = 20000连接数 3.获取数据源 Service 2.返回公司 数据库信息 1.根据公 司uuid获 取公司数 据库信息 Common数 据库 4.访问公司 库 公司数据库 微服务:10(连接数)*5 (服务实例数)*50(微服 务数量)*100(公司数) =250000 连接数 一台数据库服务器所能接受 的连接数也就是几万,微服 务架构下远远超过这个值。
29. 数据库连接不够问题(2) 3.以数据库serverId为 4.Mybatis拦截器来 key,创建数据源 修改SQL,添加 “use companyDB” Service 2.返回公司 数据库信息 1.根据公 司uuid获 取公司数 据库信息 Common数 据库 5.访问数据库 公司数据库 微服务:100(连接 数)*5(服务实例数) *1(数据库服务器) * 50(微服务数量) =25000 连接数
30. 数据库连接不够问题(3) com.microsoft.sqlserver.jdbc.SQL ServerException: The prepared statement handle 6 is not valid in this context. Please verify that current database, user default schema, and ANSI_NULLS and QUOTED_IDENTIFIER set options are not changed since the handle is prepared. USE dbName; connection.setCatalog( dbName)
31. unable to create new native thread Caused by: java.lang.OutOfMemoryError: unable to create new native thread
32. 未来规划
33. 客户端 DNS Nginx ︵ 架 构 规 划 图 ︶ NodeJS K8S微服务平台 灰度发布平 台 服务网关1 监控平台 服务网关2 微服务BFF1 微服务BFF2 服务管理平 台 Kafka 核心微服务1 核心微服务2 Redis RabbitMQ 中间件容器 化 ES LTS 中间件管理 平台 日志平台