diff --git a/README.md b/README.md index 7d9300f..24713d6 100644 --- a/README.md +++ b/README.md @@ -194,6 +194,10 @@ - [18、画图阐述一下你们的服务注册中心部署架构,生产环境下怎么保证高可用?](/docs/distributed-system/register-high-availability.md) - [19、你们系统遇到过服务发现过慢的问题吗?怎么优化和解决的?](/docs/distributed-system/service-register-discovery.md) - [20、作业:说一下自己公司的服务注册中心怎么技术选型的?生产环境中应该怎么优化?](/docs/distributed-system/register-production-optimize.md) +- [21、你们对网关的技术选型是怎么考虑的?能对比一下各种网关技术的优劣吗?](/docs/distributed-system/gateway-model-selection.md) +- [22、说说生产环境下,你们是怎么实现网关对服务的动态路由的?](/docs/distributed-system/dynamic-route.md)[代码下载点击这里哦!](https://github.com/shishan100/Java-Interview-Advanced/raw/master/docs/distributed-system/code/code2.zip) +- [23、如果网关需要抗每秒10万的高并发访问,你应该怎么对网关进行生产优化?](/docs/distributed-system/gateway-high-concurrency.md) +- [24、作业:你们公司的网关是怎么技术选型的,假设有高并发场景怎么优化?](/docs/distributed-system/gateway-technical.md) ### 第二季-高并发 diff --git a/docs/distributed-system/code/code2.zip b/docs/distributed-system/code/code2.zip new file mode 100755 index 0000000..655526a Binary files /dev/null and b/docs/distributed-system/code/code2.zip differ diff --git a/docs/distributed-system/dynamic-route.md b/docs/distributed-system/dynamic-route.md new file mode 100644 index 0000000..f416b29 --- /dev/null +++ b/docs/distributed-system/dynamic-route.md @@ -0,0 +1,22 @@ +``` +CREATE TABLE `gateway_api_route` ( + `id` varchar(50) NOT NULL, + `path` varchar(255) NOT NULL, + `service_id` varchar(50) DEFAULT NULL, + `url` varchar(255) DEFAULT NULL, + `retryable` tinyint(1) DEFAULT NULL, + `enabled` tinyint(1) NOT NULL, + `strip_prefix` int(11) DEFAULT NULL, + `api_name` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 + +INSERT INTO gateway_api_route (id, path, service_id, retryable, strip_prefix, url, enabled) VALUES ('order-service', '/order/**', 'order-service',0,1, NULL, 1); + + ``` + +你可以自己用简单的spring mvc+前端页面封装一个可视化的网关管理工作台,如果新开发了一个服务之后,就可以在这个界面上配置一下,说某个服务对应某个url路径,修改,增删改查 + +http://localhost:9000/order/order/create?productId=1&userId=1&count=2&totalPrice=50 + +生产级,企业级的功能,网关的动态路由 diff --git a/docs/distributed-system/gateway-high-concurrency.md b/docs/distributed-system/gateway-high-concurrency.md new file mode 100644 index 0000000..d401883 --- /dev/null +++ b/docs/distributed-system/gateway-high-concurrency.md @@ -0,0 +1,23 @@ + +第一个是高并发,第二个是如何优化 + +![高性能网关Zuul](/docs/distributed-system/images/gateway-high-concurrency.png) +**Zuul**网关部署的是什么配置的机器,**部署32核64G,对网关路由转发的请求**,**每秒抗个小几万请求是不成问题的,几台Zuul网关机器** + +**每秒是1万请求,8核16G的机器部署Zuul网关,5台机器就够了** + +### 生产级的网关,应该具备我刚才说的几个特点和功能: + +#### (1)动态路由:新开发某个服务,动态把请求路径和服务的映射关系热加载到网关里去;服务增减机器,网关自动热感知 +#### (2)灰度发布:基于现成的开源插件来做 +#### (3)授权认证 +#### (4)限流熔断 +#### (5)性能监控:每个API接口的耗时、成功率、QPS +#### (6)系统日志 +#### (7)数据缓存 + + + + + + diff --git a/docs/distributed-system/gateway-model-selection.md b/docs/distributed-system/gateway-model-selection.md new file mode 100644 index 0000000..d24b052 --- /dev/null +++ b/docs/distributed-system/gateway-model-selection.md @@ -0,0 +1,40 @@ + +### 网关的核心功能 + +#### (1)动态路由:新开发某个服务,动态把请求路径和服务的映射关系热加载到网关里去;服务增减机器,网关自动热感知 +#### (2)灰度发布 +#### (3)授权认证 +#### (4)性能监控:每个API接口的耗时、成功率、QPS +#### (5)系统日志 +#### (6)数据缓存 +#### (7)限流熔断 + + +### 几种技术选型 + +#### Kong、Zuul、Nginx+Lua(OpenResty)、自研网关 + +**Kong:Nginx里面的一个基于lua写的模块,实现了网关的功能** +**Zuul:Spring Cloud来玩儿微服务技术架构,Zuul** + +**Nginx+Lua(OpenResty):课程目录里面,有一个文档,课程免费学习,亿级流量系统架构的课程,详细讲解了Nginx+Lua的开发**,基于lua自己写类似Kong的网关 +**自研网关:自己来写类似Zuul的网关,基于Servlet、Netty来做网关,实现上述所有的功能** + + +大厂:BAT、京东、美团、滴滴之类的,自研网关,都是基于Netty等技术自研网关;Nginx + Lua(Tengine)来做,封装网关的功能 + +中小型公司:Spring Cloud技术栈主要是用Zuul,Gateway;如果是Dubbo等技术栈,有的采用Kong等网关,也可以直接不用网关,很多公司压根儿就没用网关,直接Nginx反向代理+负载均衡; + +Zuul:基于Java开发,核心网关功能都比较简单,但是比如灰度发布、限流、动态路由之类的,很多都要自己做二次开发 + +Kong:依托于Nginx实现,OpenResty,lua实现的模块,现成的一些插件,可以直接使用 + + + +Zuul(Servlet、Java):高并发能力不强,部署到一些机器上去,还要基于Tomcat来部署,Spring Boot用Tomcat把网关系统跑起来;Java语言开发,可以直接把控源码,可以做二次开发封装各种需要的功能 + +Nginx(Kong、Nginx+Lua):Nginx抗高并发的能力很强,少数几台机器部署一下,就可以抗很高的并发,精通Nginx源码,很难,c语言,很难说从Nginx内核层面去做一些二次开发和源码定制 + + +Java技术栈为主的大厂,很多其实用Java、Servlet、Netty来开发高并发、高性能的网关系统,自己可以把控一切 + diff --git a/docs/distributed-system/gateway-technical.md b/docs/distributed-system/gateway-technical.md new file mode 100644 index 0000000..fda1b1e --- /dev/null +++ b/docs/distributed-system/gateway-technical.md @@ -0,0 +1,6 @@ + +服务框架的原理和技术选型,你们公司到底是怎么选,为什么? + +服务注册中心,思考,你们公司到底是怎么选的,生产环境有没有做一些优化,如果没有,哪些地方是有优化空间的? + +网关系统,思考,你们公司是怎么选型的,为什么?生产环境是否对类似动态路由的功能做过优化,如果没有是否有优化空间? diff --git a/docs/distributed-system/images/gateway-high-concurrency.png b/docs/distributed-system/images/gateway-high-concurrency.png new file mode 100755 index 0000000..9bcabb0 Binary files /dev/null and b/docs/distributed-system/images/gateway-high-concurrency.png differ