• SpringCloud Alibaba商城项目实践


    为什么采取SpringCloud Alibaba,处于以下几方面考虑,首先是因为SpringCloud中的一些组件已经宣布停止更新,其次SpringCloud Alibaba提供的这些组件功能更加强大

    对于SpringCloud Alibaba的信息,官网上无论是教程还是文字都很清晰
    github地址
    在这里插入图片描述
    在本项目中会用到以下组件

    • SpringCloud Alibaba Nacos作为注册中心和配置中心
    • SpringCloud Ribbon用于负载均衡
    • SpringCloud Feign作为声明式HTTP客户端,主要负责远程调用相关
    • SpringCloud Alibaba Sentinel用于服务容错(限流,降级,熔断等)
    • SpringCloud Gateway作为API网关
    • SpringCloud Sleuth用于调用链监控
    • SpringCloud Alibaba Seata用于解决分布式事务

    版本选择

    首先需要根据SpringBoot的版本选择SpringCloud的版本,我的SpringBoot是2.2.x版本,因此SpringCloud也选择对应版本
    在这里插入图片描述
    在微服务的common服务中添加SpringCloud Alibaba管理

    
        
            
                
                    com.alibaba.cloud
                    spring-cloud-alibaba-dependencies
                    2.2.0.RELEASE
                    pom
                    import
                
            
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    注册中心

    注册中心使用的是Nacos,进入官网结合项目进行配置
    在这里插入图片描述
    首先给微服务的common模块引入依赖,因为其他模块是依赖于common模块,因此就完成了所有模块的注册中心的依赖问题

            
            
                com.alibaba.cloud
                spring-cloud-starter-alibaba-nacos-discovery
            
    
    • 1
    • 2
    • 3
    • 4
    • 5

    然后在properties文件中,或者是yml文件中配置,发现服务的地址和端口

    spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
    
    • 1

    需要下载Nacos Server
    Nacos Server下载,下载完成启动,默认8848端口
    在这里插入图片描述
    给需要注册的服务中添加完服务地址和端口后,需要在SpringBoot的启动类上加上@EnableDiscoveryClinet
    在这里插入图片描述
    如下
    在这里插入图片描述
    接下来就启动nacos的服务端
    在这里插入图片描述
    访问 http://localhost:8848/nacos
    用户名和密码默认都是nacos
    登录进去后如下图
    在这里插入图片描述
    现在启动一个已配置好的服务进行测试(如果前面没有配置应用名称需要先配置名称)

    spring:
      application:
        name: mall-coupon
    
    • 1
    • 2
    • 3

    进入Nacos管理页面,查看它的服务管理,可以看见刚刚启动的微服务
    在这里插入图片描述
    下面给所有服务进行注册
    在这里插入图片描述
    如下
    在这里插入图片描述

    远程调用服务

    通过SpringCloud Feign来进行服务的远程调用,采用的HTTP协议。
    首先需要加入open Feign的依赖,谁要调用其他的就给谁加

      
                org.springframework.cloud
                spring-cloud-starter-openfeign
            
    
    • 1
    • 2
    • 3
    • 4

    在本案例中采用的的是会员微服务调用优惠券服务
    首先给mall-member加入上面的依赖
    然后在mall-member内编写远程调用接口,并加上@FeignClient注解

    //需要调用的微服务名
    @FeignClient("mail-coupon")
    public interface CouponFeignService {
    
        // 写完整地址需要调用的方法名
        @RequestMapping("/coupon/coupon/member/list")
        public R memberCoupons();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    接下来在coupons中编写这个方法(此处为了测试写的假数据)
    在这里插入图片描述

    接下来在会员服务的controller中写一个方法进行测试远程调用,首先先注入写好的远程接口,然后使用。

        @Autowired
        CouponFeignService couponFeignService;
    
        // 远程调用优惠券服务(此方法测试远程服务)
        @RequestMapping("/coupons")
        public R testRemoteMethod() {
            MemberEntity memberEntity = new MemberEntity();
            memberEntity.setNickname("李四");
            R memberCoupons = couponFeignService.memberCoupons();
            return R.ok().put("member", memberEntity).put("coupons", memberCoupons);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    然后在会员服务的启动类上加上@EnableFeignClients开启远程调用功能

    @MapperScan("com.wrial.mall.member.dao")
    @EnableDiscoveryClient
    @EnableFeignClients(basePackages = "com.wrial.mall.member.feign")
    @SpringBootApplication
    public class MallMemberApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(MallMemberApplication.class, args);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    basePackage填的是远程调用接口的位置(我放在了feign包下)
    在这里插入图片描述
    启动会员服务和优惠券服务
    在这里插入图片描述

    访问http://localhost:8000/member/member/coupons接口测试成功
    在这里插入图片描述

    配置中心

    使用Nacos作为配置中心,参照官方demo进行配置
    官方DEMO
    首先在mall-common中导入依赖

    
         com.alibaba.cloud
         spring-cloud-starter-alibaba-nacos-config
     
    
    • 1
    • 2
    • 3
    • 4

    然后给需要配置中心的服务进行配置(我这里给我的每一个微服务都进行配置),一定要配置在bootstrap.properties配置文件中,否则不生效

     spring.application.name=nacos-config-example
     spring.cloud.nacos.config.server-addr=127.0.0.1:8848
    
    • 1
    • 2

    接下来需要在Controller上加上@RefreshScope注解,表示可以动态刷新scope
    接下来就可以写一些测试的properties然后注入到某个controller中

    在application.properties文件中写入自定义属性

    member.user.name=lisi
    member.user.age=18
    
    • 1
    • 2

    在MemberController编写一个测试的方法,并将自定义属性注入,在方法中返回

    /**
     * 会员
     *
     * @author wrial
     * @email 2806935450@qq.com
     * @date 2020-05-01 18:25:01
     */
    @RestController
    @RefreshScope
    @RequestMapping("member/member")
    public class MemberController {
        @Autowired
        private MemberService memberService;
    
        @Autowired
        CouponFeignService couponFeignService;
    
        @Value("${member.user.name}")
        String userName;
        @Value("${member.user.age}")
        Integer age;
    
        // 远程调用优惠券服务(此方法测试远程服务)
        @RequestMapping("/coupons")
        public R testRemoteMethod() {
            MemberEntity memberEntity = new MemberEntity();
            memberEntity.setNickname("李四");
            R memberCoupons = couponFeignService.memberCoupons();
            return R.ok().put("member", memberEntity).put("coupons", memberCoupons);
        }
      
         // 测试配置中心
        @RequestMapping("/name")
        public R testConfig(){
            return R.ok().put("userName",userName).put("userAge",age);
        }
    
        /**
         * 列表
         */
        @RequestMapping("/list")
        //@RequiresPermissions("member:member:list")
        public R list(@RequestParam Map params) {
            PageUtils page = memberService.queryPage(params);
    
            return R.ok().put("page", page);
        }
    
    
        /**
         * 信息
         */
        @RequestMapping("/info/{id}")
        //@RequiresPermissions("member:member:info")
        public R info(@PathVariable("id") Long id) {
            MemberEntity member = memberService.getById(id);
    
            return R.ok().put("member", member);
        }
    
        /**
         * 保存
         */
        @RequestMapping("/save")
        //@RequiresPermissions("member:member:save")
        public R save(@RequestBody MemberEntity member) {
            memberService.save(member);
    
            return R.ok();
        }
    
        /**
         * 修改
         */
        @RequestMapping("/update")
        //@RequiresPermissions("member:member:update")
        public R update(@RequestBody MemberEntity member) {
            memberService.updateById(member);
    
            return R.ok();
        }
    
        /**
         * 删除
         */
        @RequestMapping("/delete")
        //@RequiresPermissions("member:member:delete")
        public R delete(@RequestBody Long[] ids) {
            memberService.removeByIds(Arrays.asList(ids));
    
            return R.ok();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94

    访问接口
    在这里插入图片描述

    接下来就进入nacos管理台
    http://localhost:8848/nacos,添加配置信息

    在这里插入图片描述
    修改配置
    在这里插入图片描述
    在这里插入图片描述

    访问接口可以发现配置信息已经改变,优先使用配置中心的配置(默认找到配置的应用名.properties文件),比如此处的mall-member.properties
    在这里插入图片描述
    在这里插入图片描述

    细节

    1. 命名空间,用于配置隔离,默认为public在这里插入图片描述因为默认只有public,可以采取一些手段进行配置隔离,比如可以采用dev,test等等命名空间进行隔离,但是这样的话所有配置都在一起很混乱,因此可以给每一个微服务都创建一个相对于的命名空间,如下图所示在这里插入图片描述然后将创建好的命名空间和在服务中绑定,这样就可以实现微服务间的配置隔离,在此命名空间的配置不会影响到其他微服务在这里插入图片描述
    2. 配置集 :所有的配置的集合
    3. 配置集ID就是配置文件名称
    4. 配置分组:默认配置集都属于DEFAULT_GROUP,可以根据不同的场合创建不同的配置分组,组名根据自身情况,在启动时也可以在Bootstrap.properties文件中选择指定分组

    每个微服务创建自己的命名空间(namespace)保证数据隔离,使用分组来区分环境(dev,test,prod等等)保证数据的分组使用。

    接下来就可以对每个服务配置多个数据集,为mybatis,datasource,cloud等创建单独的数据集,并添加group为dev
    在这里插入图片描述
    注意:在数据集中不要出现注释信息,否则服务无法启动起来(控制台一直循环)
    在这里插入图片描述
    拆分完毕后对properties文件注释
    在这里插入图片描述
    在bootstrap.properties文件中配置

    spring.application.name=mall-coupon
    spring.cloud.nacos.config.server-addr=127.0.0.1:8848
    # 配置命名空间为coupon
    spring.cloud.nacos.config.namespace=b4440c87-67c3-4332-a508-81682ef259cf
    # 配置分组为dev
    spring.cloud.nacos.config.group=dev
    
    # 这是一个数组,data-id就是nacos配置文件名  group就是分组  refresh默认为false,true就是动态刷新
    spring.cloud.nacos.config.extension-configs[0].data-id=datasource.yml
    spring.cloud.nacos.config.extension-configs[0].group=dev
    spring.cloud.nacos.config.extension-configs[0].refresh=true
    
    spring.cloud.nacos.config.extension-configs[1].data-id=mybatis.yml
    spring.cloud.nacos.config.extension-configs[1].group=dev
    spring.cloud.nacos.config.extension-configs[1].refresh=true
    
    spring.cloud.nacos.config.extension-configs[2].data-id=other.yml
    spring.cloud.nacos.config.extension-configs[2].group=dev
    spring.cloud.nacos.config.extension-configs[2].refresh=true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    启动服务,访问接口测试
    在这里插入图片描述
    这就是使用nacos完成的配置中心

    网关

    网关使用的是GateWay,而不是Zuul,Gateway是SpringCloud在zuul后写的,也可以看做是zuul2.0
    在这里插入图片描述
    是基于Spring5,SpringBoot2.0的一个API网关,可以很容易整合服务注册发现还有Hystrix熔断,限流等等

    路由

    发一个请求给网关,网关将请求路由到指定的服务中去或者指定的地址,不同的路由根据ID来进行区分,需要指定的目的URL,Predict的集合(断言就是一些条件判断),过滤器的集合,只要断言为true就可以进行转发

    在这里插入图片描述
    运行流程就是请求到达网关后,然后查看请求映射是否正确,然后交给指定的处理器,然后请求经过过滤器到达服务,回去的规则也是如此。

    完成网关搭建,首先需要新建一个网关服务的Module,并添加上common服务的依赖,并查看SpringBoot和SpringCloud版本和其他模块相同

    在这里插入图片描述
    接下来配置服务的注册和发现(在启动类加上注解,配置discover addr),参考上面步骤
    然后再在nacos 控制台创建一个gateway的命名空间和配置文件
    在这里插入图片描述
    因为网关不需要连接数据库,因此把数据源相关的配置都去掉

    @EnableDiscoveryClient
    //用不到数据库,排除数据源相关的配置
    @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
    public class MallGatewayApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(MallGatewayApplication.class, args);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    并在配置文件简单配置几条路由规则

    # 可以配多个route
    spring:
      cloud:
        gateway:
          routes:
            - id: query_route
              uri: https://qq.com
              predicates:
                - Query=uri, qq
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848
      application:
        name: mall-gateway
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    测试在配置文件配置的路由
    在这里插入图片描述
    在这里插入图片描述
    参考文章:https://www.cnblogs.com/crazymakercircle/p/11704077.html

  • 相关阅读:
    宝宝什么时候可以断夜奶,注意这几点
    .env.serve文件新增内容获取不到
    K8S部署Java项目(Gitlab CI/CD自动化部署终极版)
    快速弄懂Python3.11中的新特性
    【C语言】快速排序__拓展
    掘根宝典之C语言字符串输出函数(puts(),fputs())
    JS 选项卡
    C# - 常用API
    DBeaver 连接Hive-3.1.2
    【深度学习】 图像识别实战 102鲜花分类(flower 102)实战案例
  • 原文地址:https://blog.csdn.net/m0_67391683/article/details/126516169