谷粒商城2020文档_谷粒商城|基础篇(二) 引入微服务
上一篇:谷粒商城|基础篇(一) 项目搭建与代码生成源码地址:https://gitee.com/baohaipeng/gulimall本文目标gulimall项目进行微服务改造探索spring cloud alibaba生态引入与测试spring cloud gateway引入与测试统一版本为避免版本不一致带来的不必要的问题,现在统一将spring cloud、spring cloud aliba
上一篇:谷粒商城|基础篇(一) 项目搭建与代码生成
源码地址:https://gitee.com/baohaipeng/gulimall
本文目标
- gulimall项目进行微服务改造探索
- spring cloud alibaba生态引入与测试
- spring cloud gateway引入与测试
统一版本
为避免版本不一致带来的不必要的问题,现在统一将spring cloud、spring cloud alibaba、spring boot版本调整的与原教程一致。
spring boot:2.1.8.RELEASE
spring cloud:Greenwich.SR3
- 打开gulimall-coupon的pom文件,修改springboot、springcloud的版本,并将gulimall-common的版本号从dependency提到properties里,进行统一配置管理。
![172c109104b26bcc38319ababac57126.png](https://img-blog.csdnimg.cn/img_convert/172c109104b26bcc38319ababac57126.png)
完整pom文件
<?xml version="1.0" encoding="UTF-8"?>4.0.0org.springframework.bootspring-boot-starter-parent2.1.8.RELEASEcom.bhp.gulimallgulimall-coupon0.0.1-SNAPSHOTgulimall-coupon谷粒商城优惠券服务1.8Greenwich.SR30.0.1-SNAPSHOTcom.bhp.gulimallgulimall-common${gulimall-common.version}org.springframework.bootspring-boot-starter-weborg.springframework.cloudspring-cloud-starter-openfeignorg.springframework.bootspring-boot-starter-testtestorg.springframework.cloudspring-cloud-dependencies${spring-cloud.version}pomimportorg.springframework.bootspring-boot-maven-pluginspring-milestonesSpring Milestoneshttps://repo.spring.io/milestone
- 同样的方法,分别将gulimall-member、gulimall-order、gulimall-product、gulimall-ware的springboot 和springcloud版本进行统一。
过程略,代码已更新至码云远程仓库:https://gitee.com/baohaipeng/gulimall
- 修改gulimall-common的pom文件,使其版本号也进行统一管理
![9db389bddadf51e87b3595292b7c1e6c.png](https://img-blog.csdnimg.cn/img_convert/9db389bddadf51e87b3595292b7c1e6c.png)
修改后完整pom文件
<?xml version="1.0" encoding="UTF-8"?> gulimall com.bhp.gulimall0.0.1-SNAPSHOT4.0.0 gulimall-common 谷粒商城公共模块8.0.223.3.21.18.164.4.132.6mysql mysql-connector-java ${mysql-connector-java.version}com.baomidou mybatis-plus-boot-starter ${mybatis-plus-boot-starter.version}org.projectlombok lombok ${lombok.version}org.apache.httpcomponents httpcore ${httpcore.version}commons-lang commons-lang ${commons-lang.version}org.apache.maven.plugins maven-compiler-plugin 77
区分端口
之前各个服务直接没有一块运行过,服务端口也没有配置,都使用的默认的8080端口,为了各个服务能共同运行,将各个模块的端口号按照下边的约定进行修改。
- gulimall-coupon:7000
- gulimall-member:8000
- gulimall-order:9000
- gulimall-product:10000
- gulimall-ware:11000
配置方法:在各自的application.yml文件里增加server.port即可
![1a2e6a7a4e80296839488cba51641533.png](https://img-blog.csdnimg.cn/img_convert/1a2e6a7a4e80296839488cba51641533.png)
声明spring-cloud-alibaba依赖
中文文档地址:https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
- gulimall-common声明spring-cloud-alibaba-dependencies版本为2.1.0.RELEASE
![9871deb8563dea23b18ef612d00d75e5.png](https://img-blog.csdnimg.cn/img_convert/9871deb8563dea23b18ef612d00d75e5.png)
com.alibaba.cloud spring-cloud-alibaba-dependencies ${spring-cloud-alibaba-dependencies.version}pomimport
引入Nacos作为注册中心
“注册中心”这几个字说的高大上得不行,其实很简单,就是将服务名与服务地址关联起来。就跟域名解析一样一样的,你输入baidu.com,浏览器去域名解析服务器获得这个域名绑定的ip,如果存在就把你送过去,不存在就报错,就这么简单。我感觉这个东西也不是必须的,本身也是解耦合思想的产物,有了更科学一点。当然注册中心还有很多其他的功能,但本质我理解就是这样。
- 下载Nacos:https://github.com/alibaba/nacos/releases
![3e7e8716ca2e276c1b5518b2fdfd94b3.png](https://img-blog.csdnimg.cn/img_convert/3e7e8716ca2e276c1b5518b2fdfd94b3.png)
选择打包好的服务即可,有很多新版本,为跟视频保持一致,我这里也选取1.1.3版本的。
- 解压后打开nacos目录下的bin文件夹,双击startup
![776b11ea2f4ae7cdac2d71589877c51e.png](https://img-blog.csdnimg.cn/img_convert/776b11ea2f4ae7cdac2d71589877c51e.png)
运行窗口
![7abf358e9687f9fae35be8add970d423.png](https://img-blog.csdnimg.cn/img_convert/7abf358e9687f9fae35be8add970d423.png)
- 访问http://127.0.0.1:8848/nacos,账号nacos,密码nacos
![e897b4586171c674bcc5b01ded0efaf1.png](https://img-blog.csdnimg.cn/img_convert/e897b4586171c674bcc5b01ded0efaf1.png)
- 修改gulimall-common的pom文件,引入Nacos Discovery Starter
![a0098c59d4d414e2c4b36dfe3dbd1c7b.png](https://img-blog.csdnimg.cn/img_convert/a0098c59d4d414e2c4b36dfe3dbd1c7b.png)
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery
- 配置Nacos服务地址、自身服务名,自身服务名与项目名一致即可
![7f3ab7ee9385a52b6fca61695c7cd0c1.png](https://img-blog.csdnimg.cn/img_convert/7f3ab7ee9385a52b6fca61695c7cd0c1.png)
server: port: 7000spring: datasource: driver-class-name: com.mysql.jdbc.Driver username: root password: root url: jdbc:mysql://127.0.0.1:3306/gulimall_sms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai cloud: nacos: discovery: server-addr: 127.0.0.1:8848 application: name: gulimall-couponmybatis-plus: mapper-locations: classpath:/mapper/**/*.xml global-config: db-config: id-type: auto
- 在启动类使用 @EnableDiscoveryClient 注解开启服务注册与发现功能
![24138dd575fbb8606daca9e9f62d69eb.png](https://img-blog.csdnimg.cn/img_convert/24138dd575fbb8606daca9e9f62d69eb.png)
- 重启gulimall-coupon项目,进入Nacos系统-服务管理-服务列表,可以看到服务已经注册成功
![0f1099275ad588f8650a508f093a0a32.png](https://img-blog.csdnimg.cn/img_convert/0f1099275ad588f8650a508f093a0a32.png)
- 同样的步骤,将gulimall-member服务也纳入Nacos管理
- 刷新Nacos,两个服务已经注册成功
![154f84aa6756548a2cc39d0d14bc356c.png](https://img-blog.csdnimg.cn/img_convert/154f84aa6756548a2cc39d0d14bc356c.png)
测试Feign远程调用
- 打开gulimall-coupon项目的CouponController.java文件,新增一个查询接口,里边逻辑随便写一下,主要是为了测调用,不要在乎细节
![618311170fdedd6890baceb6d9c38c2c.png](https://img-blog.csdnimg.cn/img_convert/618311170fdedd6890baceb6d9c38c2c.png)
/** * 测试远程调用 * @return */ @RequestMapping("/member/list") public R membercoupons(){ CouponEntity couponEntity = new CouponEntity(); couponEntity.setCouponName("耗子尾汁满3送1"); return R.ok().put("coupons",Arrays.asList(couponEntity)); }
- 打开gulimall-member项目,在com.bhp.gulimall.member目录下新建一个文件夹feign,专门用来存放远程调用的代码
![a940fe6b372ffee0b7aad14002593dc8.png](https://img-blog.csdnimg.cn/img_convert/a940fe6b372ffee0b7aad14002593dc8.png)
- 目录下新建一个接口:CouponFeignService,并使用@FeignClient(服务名)注解声明该接口为Feign远程调用接口,并在接口中调用gulimall-coupon中新建的那个测试接口,这里边的@RequestMapping后的路径需要写完整
![fbe467f3da08b7a0972fab6d9ec07bd7.png](https://img-blog.csdnimg.cn/img_convert/fbe467f3da08b7a0972fab6d9ec07bd7.png)
package com.bhp.gulimall.member.feign;import com.bhp.common.utils.R;import org.springframework.cloud.openfeign.FeignClient;import org.springframework.web.bind.annotation.RequestMapping;@FeignClient("gulimall-coupon")public interface CouponFeignService { @RequestMapping("/coupon/coupon/member/list") public R membercoupons();}
- 在gulimall-member启动类上使用@EnableFeignClients注解开启Feign远程调用功能,并标记调用接口所在路径
![ce345691fc68204f9aedda333ccbe48a.png](https://img-blog.csdnimg.cn/img_convert/ce345691fc68204f9aedda333ccbe48a.png)
package com.bhp.gulimall.member;import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;import org.springframework.cloud.openfeign.EnableFeignClients;@EnableFeignClients(basePackages = "com.bhp.gulimall.member.feign")@EnableDiscoveryClient@MapperScan("com.bhp.gulimall.member.dao")@SpringBootApplicationpublic class GulimallMemberApplication {public static void main(String[] args) {SpringApplication.run(GulimallMemberApplication.class, args);}}
在MemberController里新建一个测试接口,看看这玩意究竟起作用没有,到底能不能实现远程调用
![97d4d100e2d8b4fa2486d32d8701daa9.png](https://img-blog.csdnimg.cn/img_convert/97d4d100e2d8b4fa2486d32d8701daa9.png)
@RequestMapping("test") public R test(){ R coupons = couponFeignService.membercoupons(); return coupons; }
这个方法很简单,直接调用couponFeignService里边的方法,把调用结果输出出来。而couponFeignService里边的方法会去远程调用gulimall-coupon里的方法。如果能够输出正确结果,说明利用openfeign进行跨服务接口调用功能已经配置成功。
- 重启gulimall-member服务,访问localhost:8000/member/member/test
![0f656367b22e39d7ac6f863c101fc0b6.png](https://img-blog.csdnimg.cn/img_convert/0f656367b22e39d7ac6f863c101fc0b6.png)
看到这个亲切的字眼没?说明成功了。
开香槟!!!
引入Nacos作为配置中心
- 作为配置中心,需要在gulimall-common模块中引入一个配置中心的依赖
![f29dc4c705bda5c5e40d96565acb8c22.png](https://img-blog.csdnimg.cn/img_convert/f29dc4c705bda5c5e40d96565acb8c22.png)
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config
这个依赖就保证了,使用这个依赖的服务能够去Nacos里找自己的配置文件
- 由于各个服务在启动时需要加载各自的配置文件,所以要想让服务启动时加载到Nacos里的配置,那么在服务启动之前就得先告诉服务去哪里找配置文件。换言之,需要一个配置,这个配置优先级要高于application.yml
你猜对了,就是bootstrap.yml
- 在gulimall-coupon项目目录下新建一个bootstrao.yml文件
![f05fa0fc7c55c1a7e2f37617bff4ed2f.png](https://img-blog.csdnimg.cn/img_convert/f05fa0fc7c55c1a7e2f37617bff4ed2f.png)
spring: application: name: gulimall-coupon cloud: nacos: config: server-addr: 127.0.0.1:8848 file-extension: yml
主要内容其实就两个:
- 标注即将启动的这个服务的名字是什么,Nacos将拿着这个名字找对应的文件
- 标注配置中心的地址是什么,Nacos将去这个地址里找
- 怎么验证他到底会不会去配置中心找,其实很简单。咱们也不用按照视频里写各种东西,就去配置中心里定义一个不一样的端口,看服务最终启动的端口到底是哪个就行了。
![e874dfecad707d215166ae09df069416.png](https://img-blog.csdnimg.cn/img_convert/e874dfecad707d215166ae09df069416.png)
现在服务里的配置文件中定的端口是7000,咱们在配置中心配一个7777的端口,看看最终服务在哪个端口启动
登录nacos,配置管理、配置列表、+
![e0a27c91e337c847094b49764ea920b2.png](https://img-blog.csdnimg.cn/img_convert/e0a27c91e337c847094b49764ea920b2.png)
填写必要配置。Data ID就是bootstrap.yml里边配置的服务名.格式后缀,配置格式选择YAML,配置内容直接复制项目中的application.yml即可,修改端口为7777
![ac91e3d43ee09a4749653629bb7e6018.png](https://img-blog.csdnimg.cn/img_convert/ac91e3d43ee09a4749653629bb7e6018.png)
点击右下角发布,成功后可出现在配置列表处
![ff64c6183c2b0c2bae583383feda924d.png](https://img-blog.csdnimg.cn/img_convert/ff64c6183c2b0c2bae583383feda924d.png)
重启gulimall-coupon,发现端口确实变成7777了,这样这个功能就实验成功了,可以把bootstrap.yml里边的东西注释了。正式上线之前还是用本地的配置,这里只要知道怎么做就行了。
![238ca4a6b5b277bbb807332395f79acf.png](https://img-blog.csdnimg.cn/img_convert/238ca4a6b5b277bbb807332395f79acf.png)
文中还介绍了,配置中心各种花里胡哨的用法,不学也罢,用到百度一搜就可以了。用不到,硬记没啥用,用到了咋用都可以。
引入spring-cloud-gateway作为网关
网关是啥,网关就是小区大门,大门有门禁。没有门卡拦到门外,有门卡进来。进来之后你想去几号楼几单元,门口物业保安给你指条道,这就是“路由”。
- 选中gulimall、右键new、module、spring initializr新建gulimall-gateway模块
![30513e00b70a67e29f7a0d67b7845d25.png](https://img-blog.csdnimg.cn/img_convert/30513e00b70a67e29f7a0d67b7845d25.png)
- 选上gateway的依赖,next到完成
![d93f7904c0c123166e5e5f4c8d7fe0bb.png](https://img-blog.csdnimg.cn/img_convert/d93f7904c0c123166e5e5f4c8d7fe0bb.png)
- 按照前边版本统一的要求,修改一下springboot和spring cloud的版本
![4b10a738d56a596cad992c01b9b2548e.png](https://img-blog.csdnimg.cn/img_convert/4b10a738d56a596cad992c01b9b2548e.png)
- 由于gulimall-common模块中有nacos依赖,gulimall-gateway也需要引入gulimall-common依赖
![cd8e59e2e699c2978dce8eb444103c9f.png](https://img-blog.csdnimg.cn/img_convert/cd8e59e2e699c2978dce8eb444103c9f.png)
完整pom文件
<?xml version="1.0" encoding="UTF-8"?>4.0.0org.springframework.bootspring-boot-starter-parent2.1.8.RELEASEcom.bhp.gulimallgulimall-gateway0.0.1-SNAPSHOTgulimall-gateway谷粒商城网关服务1.8Greenwich.SR30.0.1-SNAPSHOTcom.bhp.gulimallgulimall-common${gulimall-common.version}org.springframework.cloudspring-cloud-starter-gatewayorg.springframework.bootspring-boot-starter-testtestorg.springframework.cloudspring-cloud-dependencies${spring-cloud.version}pomimportorg.springframework.bootspring-boot-maven-pluginspring-milestonesSpring Milestoneshttps://repo.spring.io/milestone
- 网关对nacos来说也是一个独立的服务,需要注册到注册中心,所以给网关启动类增加@EnableDiscoveryClient注解
![e5861f74096c33371c3876bd702cc86c.png](https://img-blog.csdnimg.cn/img_convert/e5861f74096c33371c3876bd702cc86c.png)
- 由于引入了gulimall-common模块,而gulimall-common模块又引入了数据库连接的依赖,网关服务又不需要连接数据库,所以gulimall-gateway需要标注排除数据源的自动配置,要不然项目启动时就会由于数据库连接找不到url等数据源配置而报错。在网关启动类的@SpringBootApplication注解后加上排除(exclude = {DataSourceAutoConfiguration.class})
![8977fd168d1aa1fe76ab1e4bfeef85fc.png](https://img-blog.csdnimg.cn/img_convert/8977fd168d1aa1fe76ab1e4bfeef85fc.png)
- 由于gulimall-common模块又引入了nacos的配置依赖,那么网关服务也得配置nacos配置中心的信息,要不然启动时也会因为找不到配置中心的配置数据而报错,总之不管你用不用配置中心,你得把配置中心得地址写好,不然就不给你启动。所以需要新建一个bootstrap.yml
![bf3b25030913b965165b388ca2d12c74.png](https://img-blog.csdnimg.cn/img_convert/bf3b25030913b965165b388ca2d12c74.png)
spring: application: name: gulimall-gateway cloud: nacos: config: server-addr: 127.0.0.1:8848 file-extension: yml
- 实际上我就没有用远程的配置文件,而是直接在本地写的application.yml,配上远程地址,如果nacos没有找到配置文件,它就会使用本地的,但是你不配置远程地址那就会报错。
![c7224d9c92fd4292772fe2b9aeeb3ed6.png](https://img-blog.csdnimg.cn/img_convert/c7224d9c92fd4292772fe2b9aeeb3ed6.png)
你想把这个配置文件放配置中心当然可以,没什么区别。我就是放这里,至于为什么,不为什么,我就想放这里,咋了?
server: port: 88spring: cloud: nacos: discovery: server-addr: 127.0.0.1:8848 application: name: gulimall-gateway
启动gulimall-gateway服务,01,01,我是02,服务启动正常!服务注册正常!
![75d1c7c4ce1e0ad22e8e0cdcc467ba6b.png](https://img-blog.csdnimg.cn/img_convert/75d1c7c4ce1e0ad22e8e0cdcc467ba6b.png)
![11492130243ece81bb6d8456dc602cdc.png](https://img-blog.csdnimg.cn/img_convert/11492130243ece81bb6d8456dc602cdc.png)
- 纸上得来终觉浅,要干大事得冒险!下面咱们冒险试一试这个玩意好用不?不好用别怪我,我不生产知识,我只是知识得搬运工。
先在application.yml中配置一个路由规则,理论上来说当我访问http://localhost:88/search?aaa=bhp的时候,他应该给我跳到百度
![e6184287884bfd69820440b0d1b11433.png](https://img-blog.csdnimg.cn/img_convert/e6184287884bfd69820440b0d1b11433.png)
server: port: 88spring: cloud: nacos: discovery: server-addr: 127.0.0.1:8848 gateway: routes: - id: bhp_route uri: https://baidu.com predicates: - Query=aaa,bhp application: name: gulimall-gateway
重启、访问http://localhost:88/search?aaa=bhp,果然跳到百度了,页面不存在是因为没有baidu.com/serch这个页面
![f7024964872a804f6dee879728b65211.png](https://img-blog.csdnimg.cn/img_convert/f7024964872a804f6dee879728b65211.png)
至此spring-cloud-gateway的使用讲完了。
微服务的讲解也暂时告一段落了。
![25e226adf12569a0052a4de18189e602.png](https://img-blog.csdnimg.cn/img_convert/25e226adf12569a0052a4de18189e602.png)
更多推荐
所有评论(0)