一、 为什么写,要写什么?
半年前,从上一家做游戏的公司离职了。休息之后,准备开始转向互联网行业。
然而,项目经历不是很充足。所以,准备和朋友一起写一个简单的服务器。
目标只有一个,用到大部分热门的技术。
之后,按这个目标大概聊了一下,基本制定了以下流程:
1)先从最简单的目标实现,用中间件比较多、比较成熟的技术。
2)代码放到github,文档信息使用腾讯文档进行同步,最终服务部署在一台阿里云服务器上。初步定下每天2小时投入。
3)初步选择了要使用的技术,基本是从工作需求选的,Java Spring Boot(工作多,开发块)、Docker、Redis、MongoDB、Kafka、K8S、Gradle(使用后,发现比较容易出一些小问题,后来换成了Maven)
4)第一阶段,以最简单的网站服务为目标实现,支持注册、登录,支持拉取内容。
写这个文章,一方面是为了理清思路,另外也是记录一下过程中遇到的问题,希望其他人可以避免。
二、 初步分工计划
目标制定之后,开始了初步分工(以下用A来代替我,B来代替另外那个朋友):
1)A一个简单的服务器架构图
2)B简单的需求文档,包含基本的客户端接口需求
3)一部分时间看下自己需要补充的技术知识
第一阶段学习目标如下:
A: Docker、Kafka、MongoDB
B: Spring Cloud相关,eureka、gateway、redis等常用中间件
三、 第一阶段目标
1. 服务器架构
架构图是用ProcessOn来画的。第一阶段的服务器架构很简单,只有最基本的功能:服务发现、网关、配置中心、缓存、数据库、以及其他功能服务。
![3bf65bb8169796029c5775e1c4674fd5.png](https://img-blog.csdnimg.cn/img_convert/3bf65bb8169796029c5775e1c4674fd5.png)
2. 需求文档
第一阶段需求只有三个部分:主界面(包括一些文章分类、文章内容)、文章详情界面(文章详细内容)、用户登录注册界面
四、 开发过程
- 项目创建
开发工具选择Idea。目录结构选择了一个大的目录,下边分别创建新的Module作为服务器。
![850c66b1f5f827896f2a6dca5479c710.png](https://img-blog.csdnimg.cn/img_convert/850c66b1f5f827896f2a6dca5479c710.png)
项目使用Spring Initializr进行创建,可以相对方便的选择依赖。具体服务功能、依赖项如下:
1)Eureka:服务发现功能,用于其他服务器之间相互获取地址。
依赖项:spring-cloud-starter-netflix-eureka-server
2)Gateway: 网关功能,所以客户端请求的入口。第一阶段只负责服务转发功能,后续限流、安全相关功能也会在这个服务处理。
依赖项:spring-cloud-starter-gateway、spring-cloud-starter-netflix-eureka-client(除了Eureka之外的所有服务,都需要依赖这个组件来连接到Eureka服务上)
3)User Server: 具体功能模块,在此只是做个示例。
依赖项:spring-cloud-starter-netflix-eureka-client、spring-boot-starter-web(用于Web应用的基本功能,包括REST常用内容)、lombok(本身没有具体功能,只是可以自动生成一些函数,例如getter、setter等,可以节约很多时间,代码也更简洁)
2. 开发过程以及遇到的问题
2.1 学习资源
Spring Boot的学习,其实官网就有给出学习案例,建议按照官网的内容,大概学习4-5个常用的模块,之后就基本对流程有了解了。推荐以下几个比较常用的:
- https://spring.io/guides/gs/rest-service/
- https://spring.io/projects/spring-cloud-gateway
- https://spring.io/projects/spring-cloud-openfeign
- https://spring.io/projects/spring-cloud-netflix(重点Eureka使用)
- https://spring.io/projects/spring-data-redis(需要本地安装Redis)
2.2 一系列无法识别的问题
大部分问题,其实很简单:Maven下载过程太慢了,导致还没有识别到你的那些代码。
所以,建议操作流程如下:
- 到Maven官网下载一个稳定版本的Maven,解压到本地。
- 修改目录下confsettings.xml文件,找到Mirrors节点,加入阿里云的服务器地址。
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
- 在File->Settings->Build, Execution, Deployment->Build Tools->Maven界面,配置Maven home directory到你的软件目录。
![1202e2d0efd4393442de6db25f65bab9.png](https://img-blog.csdnimg.cn/img_convert/1202e2d0efd4393442de6db25f65bab9.png)
基本上,配置完成后大部分问题就已经解决了。
2.3 Eureka
项目结构如下:
![d8d3d03a95684d207df888be99ddc8c7.png](https://img-blog.csdnimg.cn/img_convert/d8d3d03a95684d207df888be99ddc8c7.png)
Eureka服务相对内容简单,只需要在Application的类上加上注解@EnableEurekaServer就可以了
![2508532a5faaaf98d48a9035af7a1b55.png](https://img-blog.csdnimg.cn/img_convert/2508532a5faaaf98d48a9035af7a1b55.png)
配置文件,初始版本是application.properties,个人更习惯yaml,所以重新创建了yaml文件。-dev和-pro可以区分开发环境和生产环境,具体在服务运行的Configuration中,Active Profiles填dev或者pro即可。
![9097618c07f5ed03d0e06852a3391bec.png](https://img-blog.csdnimg.cn/img_convert/9097618c07f5ed03d0e06852a3391bec.png)
配置内容包括几部分:
- 服务名称:spring.application.name,所有服务都通过此方式命名,之后可以从eureka界面上看到服务名称,而不是IP:Port。
- 服务端口:server.port,所有服务都需要制定,没有的话走默认端口,可能引起冲突。
- 注册到Eureka服务地址:eureka.client.service-url是eureka服务的配置地址,eureka server需要配置是因为其实eureka server本身也是一个client。defaultZone是一般的默认地址。如果需要多个eureka server,互相讲地址写在这里就可以。
![8ad84809f76e4d703c8508cb39ac792a.png](https://img-blog.csdnimg.cn/img_convert/8ad84809f76e4d703c8508cb39ac792a.png)
2.4 Gateway
项目结构与eureka一致,不再写了。
有一个可能出现的问题是:gateway和starter web可能会有冲突,导致启动的时候出现bean注册失败。删除starter web的依赖,重新导入下maven就可以了。
代码逻辑中,加入@EnableEurekaClient连接到eureka server(其他所有服务也一致,之后不再描述)。
![8ec992f2d459d70a807e46d5048af17d.png](https://img-blog.csdnimg.cn/img_convert/8ec992f2d459d70a807e46d5048af17d.png)
网关配置
路由配置:spring.cloud.routes,路由转发配置,id自定义,uri为想要转发到的服务地址。lb://xxx为xxx服务在eureka注册的地址。Predicates为规则匹配条件,filter为请求处理,StripPrefix是指请求上去掉几个/*/的部分。
最终这条转发的结果是:{gateway地址}/user/xx -> {ntech-user地址}/xx。
还有一些其他的转发选项可以用,例如匹配GET、POST方法,匹配cookie等,可以参考官方文档。
https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.2.RELEASE/reference/html/
![3a3d33a4743fe85d3ca501992092fe0e.png](https://img-blog.csdnimg.cn/img_convert/3a3d33a4743fe85d3ca501992092fe0e.png)