介绍
mgt-shop是一款基于SpringCloudAlibaba从0到1构建的商城系统,本篇主要将SpringCloudAlibaba相关微服务组件集成到mtg-shop的项目中,具体的组件有:
-
Nacos服务发现集成:主要将微服务通过nacos客户端注册到nacos服务端。
-
Nacos配置中心集成:可以替代springcloud-config组件,基于命名空间和group能够设置多开发环境,如:dev/test/pre/prod。也可以对项目中的配置做拆分,如:数据源配置、Redis链接配置等等。
-
OpenFegin集成:服务与服务之间的调用将通过OpenFegin组件实现,也可以做到类似dubbo,提供者可以抽象接口依赖jar包,消费者依赖jar包进行开发,让消费者不在维护提供者提供的接口。
-
GetWay集成:旨在为微服务架构提供⼀种简单有效的统⼀的API路由管理⽅式。
Nacos服务发现集成
由于Nacos1.x版本底层的协议使用的是http的方式,Nacos2.x版本底层增加了gRpc长连接的方式,所以我们尽量的去使用新版本。但是我们发现当我们将SpringCloudAlibaba2021.0依赖进行之后发现,它依赖的nacos还是1.4.x版本,所以我们将其排除掉并使用nacos2.0.0的客户端版本。这里先创建一个common模块用来存放所有公用的模块。
添加common模块的依赖,将mtg-order纳入到注册中心,mtg-order配置文件配置如下
server:
port: 9002
spring:
application:
name: mtg-order
cloud:
nacos:
discovery:
server-addr: 192.168.56.10:8848
启动mtg-order,根据《SpringCloud Alibaba之Nacos客户端启动流程源码分析》我们可以验证一下nacos2.0版本是否使用了gRpc,首先找到注册服务的代码块,并将代码块打断点,看下启动的时候是否进入gRpc的方式进行服务的注册。
NamingGrpcClientProxy.registerService
当前组件是将mtg-order服务通过gRpc的方式注册到nacos的服务端,nacos客户端启动流程源码分析我们已经分析过了,这里不做赘述。看下注册中心管理平台。其它几个服务做同样的配置,将其纳入到注册中心。
Nacos配置中心
依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<exclusions>
<exclusion>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</exclusion>
</exclusions>
</dependency>
nacos config使用
在nacos的控制台中,提供了namespace命名空间,它可以定义各个模块,模块与模块之间相互隔离,例如:mtg-order模块、mtg-product模块等,可以在每个模块中定义自己的配置。
具体操作结果如下图所示
在namespace有group,可以将每个模块进行分组,利用分组可以达到不同的环境,如:dev/test/pre/prod。
nacos控制台设置不同的环境,如下图所示
再来个demo
在product中配置一个提示信息,用于在商品抢购的时候,被抢完了,此时返回给客户端一个提示信息:客官你来晚了,商品已经被抢购一空~~~,未来提示信息可能会变化,所以我们要将其当做一个配置项应变未来可能的变化,类似的情况都可以这样做。
1、配置bootstrap.properties,nacos-config的配置信息。
spring:
application:
name: mtg-product
cloud:
nacos:
config:
server-addr: 192.168.56.10
#mtg-product的namespace对应的id
namespace: c1b104cd-ec77-4d7b-b5a0-491c1fbc3766
#我们选择pre
group: pre
2、创建常量类
3、客户端调用
当nacos控制台的值变化的时候,调用方的数据会自动刷新
OpenFegin集成
依赖和配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
将openfeign放入common模块,绝大部分的模块应该都会依赖它,版本的选择在上一篇文章已经说过。配置很简单,只需要在启动类上添加一个开启注解即可。
@EnableFeignClients
使用OpenFeign
在使用OpenFeign的时候,服务与服务之间调用api的管理,采用如下的方式进行管理。
当order模块调用product模块的一个接口,我们将这个接口抽出来放到一个模块mtg-product-sdk,只要product需要往外提供的接口都定义在这个模块中。这样的好处在于提供者提供服务的时候会单独给一个jar包,消费者依赖这个jar包,消费者不需要关心未来jar包的维护,如果提供者修改了字段或者新增方法,消费者只需要更新jar包就可以。接下来开发一个demo,product提供一个接口,order依赖这个接口并利用OpenFeign发起调用。
一、创建mtg-product-sdk模块
二、product依赖sdk并做具体的实现
三、order继承sdk并通过OpenFeign发起调用
OpenFeign集成完毕,未来就会按照这种方式进行服务与服务之间的调用。
GetWay集成
网关的作用:旨在为微服务架构提供⼀种简单有效的统⼀的API路由管理⽅式。让服务提供者不直接和客户端进行通信,采用网关统一管理。
SpringCloud的GetWay主要提供的功能包括:路由、断言和过滤器。通过官网可以看到他提供了很多功能。
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
创建mgt-gateway模块
做一个简单的demo
server:
port: 9005
spring:
application:
name: mtg-gateway
cloud:
nacos:
discovery:
server-addr: 192.168.56.10:8848
gateway:
routes:
- id: baiduUrl
uri: https://www.baidu.com
predicates:
- Query=uri,baidu
访问当前项目并在uri地址后面增加一个uri=baidu的一个参数,让其跳转到baidu的主页,可以看到gateway生效了。