架构图
前端服务直接部署在阿里云上
微服务划分
前端架构采用 react+antd+umi的一个技术栈
技术选型
采用springcloud alibab 全家桶
- 注册中心 : nacos
- 配置中心: nacos
- 远程调用,负载均衡,OpenFeign,ribbon
- 熔断降级:sentinel
- 网关:gateway
- 流量监控:sleuth + zipkin
- 分布式事务: seata
版本选择
springcloud-alibaba 和 springcloud 和springboot 之间是有对应关系,我在之前的文章里写过,现在就直接抄
<!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.zc.eshop</groupId>
<artifactId>eshop-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.2.7.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
nacos
微服务之间采用nacos作为注册中心和配置中心
在common模块中引入nacos依赖
<!-- nacos-->
<!-- 服务注册/发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- nacos-->
docker 配置nacos
docker pull nacos/nacos-server
docker run -d -p 8848:8848 --env MODE=standalone --name nacos nacos/nacos-server
docker update nacos --restart=always
访问 http://ip:8848/nacos 就可以看到页面了,账号密码默认 nacos nacos
文件配置
application.yml中
最后在启动类上添加注解 @EnableDiscoveryClient
作为配置中心
- 引入依赖
<!-- 配置中心来做配置管理-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- 增加配置 bootstrap.properties
spring.cloud.nacos.config.server-addr=192.168.10.129:8848
spring.application.name=eshop-admin
- 在nacos的配置列表里面添加一个 名字.properties的文件
- 在用到文件的类上添加 @RefreshScope 注解,这样在nacos上发布的配置应用就可以
不重启
生效
不同开发环境的配置
- 有几个微服务就创建几个命名空间,
注意名字一定是要微服务名称.properties结尾
,然后把微服务上的命名空间和nacos对应,并且在每个命名空间下创建不同的环境
- 在单独的微服务上配置环境
spring.cloud.nacos.config.server-addr=192.168.10.129:8848
spring.application.name=eshop-wares
# 命名空间的id
spring.cloud.nacos.config.namespace=68c0832a-8537-446a-b39a-556d5dae4767
# 环境
spring.cloud.nacos.config.group=prod
加载多配制集
- 把本地配置文件分配拆分成不同的nacos配置
- bootstrap.properties 配置文件中修改配置方式
openFeign
- 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
思考
controller 有的时候是返回给前端接口需要查询额外的信息,而微服务之间相互调用的情况可能不需要一些额外的查询,比如图片的base64资源等等。所以在controller下定义一个web和一个api的包,web里面就放专门和前端通信的接口,而api则放跟微服务之间相互调用的接口,
并且feign的调用都是通过接口的形式,不同微服务之间调用同一个微服务原本需要在自己的包下创建interface,如果接口改变了调用方也不好察觉,于是准备把feign的接口定义在common中,然后让api中的controller实现对应接口
2. @EnableFeignClients 默认是扫描当前包下的,如果微服务之间包名不一样,可能扫不到,所以直接指定
3. 被调用方
4. feign本身,注意名字要和服务在nacos上注册的相同
网关gateway
- 引入依赖,
并且要把spring-boot-starter-web
排除
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
- gateway 提供了两类现成的断言和过滤器,key直接通过配置使用
- 配置信息查看官网 官网.
- 项目配置, 下面的配置表示如果访问 http:// 网关pi/admin/xxxxx ,网关匹配到前缀 /admin 就会把服务转发给 nacos上面服务名称为eshop-admin的服务,并且负载均衡,把 /admin/xxxx 路径全部带过去
spring:
cloud:
gateway:
routes:
- id: path_route
uri: lb://eshop-admin
predicates:
- Path=/admin/**
后端微服务命名
网关 eshop-gateway 2001
后台管理 eshop-admin 3001
商品管理 eshop-wares 4001
仓储服务 eshop-storage 5001
优惠服务 eshop-coupon 6001
用户服务 eshop-user 7001
订单服务 eshop-order 8001
整合第三方服务 eshop-thirdparty 9001
公共模块
eshop-common
公共模块需要引入的东西
- mapper struct 一个很好用的类型转换的框架,可以自动生成转换impl
需要引入这4个依赖
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.4.2.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.4.1.Final</version>
</dependency>
<!-- lombok dependencies should not end up on classpath -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.4.1.Final</version>
</dependency>