Docker+Dubbo+Zookeeper+Nginx+Springboot负载均衡整合记录

上一篇博客提到第一个考核任务是做一个发送短信的接口,接口要求防刷,也就是防止被短信轰炸软件来调用

我所想到的策略和实现在上一篇博客中写到了,经过第一次答辩后,又提出了一些新的要求和问题

大致如下:

1.Redis做缓存 挂掉了怎么办 所以还是要走数据库 我的解决是在调用接口时 ping一下redis 如果连接正常会回pong 这样就走缓存 不然就走数据库 但是感觉有点呆  改成了try中走redis catch中走mysql 然后设置

spring.redis.timeout 稍微短一点

不然在redis挂掉之后 一条请求来会多次重新连接redis 处理速度很慢 

2.短信发送可以做成一个服务提供者 供不同的消费者来调用 比如注册时 修改密码时等等 这个在之前已经做了 但是不够完善

3.在上一步的基础上 将服务集群化 部署2个以上的服务提供者 用docker搭载 然后做负载均衡

还有一些其他的代码 接口 日志不是很规范的问题

所以这周的主要任务就是:Docker+Dubbo+Zookeeper+Nginx+Springboot全部都要整合到一起

刚开始的时候我确实是wdnmd我不打了我崩溃了 因为除了springboot在学校里自己做项目的时候用到过 别的这些名词只是大致知道是干什么用的 把他们之间的作用、关系理清楚 最后成功跑起来 还因为这周有很多的欢迎活动...所以一共差不多就3天的写代码和学习时间 让我这个混子感觉到了巨大的压力 

之前所有对于“分布式”“微服务”的了解 都只是偶尔看到几篇博客 还有李智慧的那本《大型网站》 看的时候也是当个科普书籍看的

说了很多废话 下面还是直接进入正题 我会记录一些关键步骤和我当时参考的其他博客 后续的代码会发到github上

 

在整合之前首先还是要搞清楚他们之间的作用和整合的顺序

首先项目是用Springboot编写的 缓存使用Redis 数据库MySQL 用了一个消息队列 不过这个不关键

接下来是dubbo和zk这两个的整合

具体的步骤是:

1.编写公共的接口项目 其中实体类记得要继承序列化接口

2.将这个项目 先用maven install打成jar包 之后用maven把这个jar包注册到本地仓库(关键) 指令是

mvn install:install-file -Dfile=XXXX.jar -DgroupId=XXXX -DartifactId=XXXXX -Dversion=XXXX -Dpackaging=jar

其中Dfile 如果你在这个jar的目录下使用mvn指令 那就只用输入jar包的名字交了 剩下的groupid artifactid 版本 都是后续你引入这个jar包时的标志

这一部分具体可以参考:

https://www.cnblogs.com/darling2047/p/9681181.html

https://blog.csdn.net/lixiaoxiong55/article/details/85936260

注意点是 引入了公共接口的实体类和服务后 记得把原来项目中import自身的依赖全部改成公共接口项目的依赖

因为很多人都是先写好一个项目之后再改造成服务提供者 还有就是 暴露服务的Service注解 引入的是dubbo里的依赖 不要引入成spring里面的注解 将这个接口用dubbo的service注解暴露后 就不能再直接访问这个服务了 

3.编写好项目后 把项目放到docker上 这一步我的操作是需要先将写好的这个项目(包括提供者也包括消费者)打成jar包 所以最好一次到位 不然改一下又要重新打- -

这里要注意的点是:假如单独把一个springboot项目放到docker上 而不把使用到的redis mysql 消息队列中心 等等需要写ip和端口的组件放到docker上 即:试图让docker中运行的项目去访问宿主机上的信息 那么ip肯定不能写localhost 也不能写127.0.0.1 因为这会让项目去访问容器自身 解决办法可以百度“docker访问宿主机” 

不过由于公司滴电脑我是不关的 所以可以有一个最简单的解决办法 就是直接ipconfig获取本机ip 然后在所有填写ip的地方填写该ip 这一做法是亲测有效的

接下来要注意的就是mysql需要开启远程连接 百度一下两步就行

4.放到docker上的项目注册到zookeeper  记得把springboot对dubbo配置中的zk地址改好 再跑到docker上

这里我使用的是idea自带的docker来操作的 因为更方便看到控制台 

按照这篇博客即可:https://www.cnblogs.com/hsz-csy/p/9183946.html

最后可以先不用把idea里的镜像停掉 继续下一步

5.接下来是负载均衡 dubbo已经在服务层面上做了负载均衡 可以跑2个同样的provider 稍微做一点标记 比如provider1被调用 就在控制台输出1 或者打到日志里 然后用1个消费者去调用 会发现dubbo自己会选择一个provider来服务

而nginx是在http web层就进行了负载均衡

关于nginx的入门可以参考https://www.cnblogs.com/memoryXudy/p/7778101.html

这篇博客里面的配置文件除了第一行的

是显示错误 其他的可以完全拷贝过去 覆盖原config文件

另外建议每次更改config之后 直接任务管理器关掉nginx的进程再重启 因为我用reload指令总是没用 我也不知道为什么

6.最后的构成是:

2个provider 运行在docker中 并在dubbo中注册 这两个provider 除了名字和一点标志性的输出不一样外都是一样的

这个consumer1 其实是两个同名的消费者 

然后用nginx来分配他们两个端口

我使用的是:

前者是docker映射端口 后者是本机端口

nginx配置的是前者 

之后测试:

我在dubboadmin中配置了我这个服务的负载策略是轮询 所以每4次调用的顺序是 con1pro1 con2pro1 con1pro2 con2pro2这样

最后是这么多东西的打开顺序

1.先开zk 我用的是3.5.5版本的 管理员cmd下进入bin 然后zkServer

2.再开dubboadmin 我直接是java -jar来开那个jar包的 

3.开两个provider 之后看一下dubboadmin中提供者数量是否正确

4.开两个consumer consumer要在provider之后开启 不然会找不到服务提供者 在之前用maven打包的时候

 也可以用mvn package -DskipTests来打包 我在直接打包的时候Test是无法通过的 因为此时provider在容器内 而consumer没有进入docker 所以提示找不到服务 这里直接跳过test就好了 跑到docker上之后是没问题的

5.开nginx 最后测试即可

高强度四处抄作业 真滴累

代码实在有点乱 稍微整理一下再放到github上

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章