上一篇:谷粒商城|基础篇(一) 项目搭建与代码生成

源码地址:https://gitee.com/baohaipeng/gulimall


本文目标

  1. gulimall项目进行微服务改造探索
  2. spring cloud alibaba生态引入与测试
  3. 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

完整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

修改后完整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

声明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
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

选择打包好的服务即可,有很多新版本,为跟视频保持一致,我这里也选取1.1.3版本的。

  • 解压后打开nacos目录下的bin文件夹,双击startup
776b11ea2f4ae7cdac2d71589877c51e.png

运行窗口

7abf358e9687f9fae35be8add970d423.png
  • 访问http://127.0.0.1:8848/nacos,账号nacos,密码nacos
e897b4586171c674bcc5b01ded0efaf1.png
  • 修改gulimall-common的pom文件,引入Nacos Discovery Starter
a0098c59d4d414e2c4b36dfe3dbd1c7b.png
        com.alibaba.cloud            spring-cloud-starter-alibaba-nacos-discovery        
  • 配置Nacos服务地址、自身服务名,自身服务名与项目名一致即可
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
  • 重启gulimall-coupon项目,进入Nacos系统-服务管理-服务列表,可以看到服务已经注册成功
0f1099275ad588f8650a508f093a0a32.png
  • 同样的步骤,将gulimall-member服务也纳入Nacos管理
  • 刷新Nacos,两个服务已经注册成功
154f84aa6756548a2cc39d0d14bc356c.png

测试Feign远程调用

  • 打开gulimall-coupon项目的CouponController.java文件,新增一个查询接口,里边逻辑随便写一下,主要是为了测调用,不要在乎细节
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
  • 目录下新建一个接口:CouponFeignService,并使用@FeignClient(服务名)注解声明该接口为Feign远程调用接口,并在接口中调用gulimall-coupon中新建的那个测试接口,这里边的@RequestMapping后的路径需要写完整
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
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
    @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

看到这个亲切的字眼没?说明成功了。

开香槟!!!

引入Nacos作为配置中心

  • 作为配置中心,需要在gulimall-common模块中引入一个配置中心的依赖
f29dc4c705bda5c5e40d96565acb8c22.png
        com.alibaba.cloud            spring-cloud-starter-alibaba-nacos-config        

这个依赖就保证了,使用这个依赖的服务能够去Nacos里找自己的配置文件

  • 由于各个服务在启动时需要加载各自的配置文件,所以要想让服务启动时加载到Nacos里的配置,那么在服务启动之前就得先告诉服务去哪里找配置文件。换言之,需要一个配置,这个配置优先级要高于application.yml

你猜对了,就是bootstrap.yml

  • 在gulimall-coupon项目目录下新建一个bootstrao.yml文件
f05fa0fc7c55c1a7e2f37617bff4ed2f.png
spring:  application:    name: gulimall-coupon  cloud:    nacos:      config:        server-addr: 127.0.0.1:8848        file-extension: yml

主要内容其实就两个:

  1. 标注即将启动的这个服务的名字是什么,Nacos将拿着这个名字找对应的文件
  2. 标注配置中心的地址是什么,Nacos将去这个地址里找
  • 怎么验证他到底会不会去配置中心找,其实很简单。咱们也不用按照视频里写各种东西,就去配置中心里定义一个不一样的端口,看服务最终启动的端口到底是哪个就行了。
e874dfecad707d215166ae09df069416.png

现在服务里的配置文件中定的端口是7000,咱们在配置中心配一个7777的端口,看看最终服务在哪个端口启动

登录nacos,配置管理、配置列表、+

e0a27c91e337c847094b49764ea920b2.png

填写必要配置。Data ID就是bootstrap.yml里边配置的服务名.格式后缀,配置格式选择YAML,配置内容直接复制项目中的application.yml即可,修改端口为7777

ac91e3d43ee09a4749653629bb7e6018.png

点击右下角发布,成功后可出现在配置列表处

ff64c6183c2b0c2bae583383feda924d.png

重启gulimall-coupon,发现端口确实变成7777了,这样这个功能就实验成功了,可以把bootstrap.yml里边的东西注释了。正式上线之前还是用本地的配置,这里只要知道怎么做就行了。

238ca4a6b5b277bbb807332395f79acf.png

文中还介绍了,配置中心各种花里胡哨的用法,不学也罢,用到百度一搜就可以了。用不到,硬记没啥用,用到了咋用都可以。

引入spring-cloud-gateway作为网关

网关是啥,网关就是小区大门,大门有门禁。没有门卡拦到门外,有门卡进来。进来之后你想去几号楼几单元,门口物业保安给你指条道,这就是“路由”。

  • 选中gulimall、右键new、module、spring initializr新建gulimall-gateway模块
30513e00b70a67e29f7a0d67b7845d25.png
  • 选上gateway的依赖,next到完成
d93f7904c0c123166e5e5f4c8d7fe0bb.png
  • 按照前边版本统一的要求,修改一下springboot和spring cloud的版本
4b10a738d56a596cad992c01b9b2548e.png
  • 由于gulimall-common模块中有nacos依赖,gulimall-gateway也需要引入gulimall-common依赖
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
  • 由于引入了gulimall-common模块,而gulimall-common模块又引入了数据库连接的依赖,网关服务又不需要连接数据库,所以gulimall-gateway需要标注排除数据源的自动配置,要不然项目启动时就会由于数据库连接找不到url等数据源配置而报错。在网关启动类的@SpringBootApplication注解后加上排除(exclude = {DataSourceAutoConfiguration.class})
8977fd168d1aa1fe76ab1e4bfeef85fc.png
  • 由于gulimall-common模块又引入了nacos的配置依赖,那么网关服务也得配置nacos配置中心的信息,要不然启动时也会因为找不到配置中心的配置数据而报错,总之不管你用不用配置中心,你得把配置中心得地址写好,不然就不给你启动。所以需要新建一个bootstrap.yml
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

你想把这个配置文件放配置中心当然可以,没什么区别。我就是放这里,至于为什么,不为什么,我就想放这里,咋了?

server:  port: 88spring:  cloud:    nacos:      discovery:        server-addr: 127.0.0.1:8848  application:    name: gulimall-gateway

启动gulimall-gateway服务,01,01,我是02,服务启动正常!服务注册正常!

75d1c7c4ce1e0ad22e8e0cdcc467ba6b.png
11492130243ece81bb6d8456dc602cdc.png
  • 纸上得来终觉浅,要干大事得冒险!下面咱们冒险试一试这个玩意好用不?不好用别怪我,我不生产知识,我只是知识得搬运工。

先在application.yml中配置一个路由规则,理论上来说当我访问http://localhost:88/search?aaa=bhp的时候,他应该给我跳到百度

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

至此spring-cloud-gateway的使用讲完了。

微服务的讲解也暂时告一段落了。

25e226adf12569a0052a4de18189e602.png
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐