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管理

<!--需要与SpringBoot的版本对应,写到DependencyManagement管理版本-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

注册中心

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

        <!--服务注册于发现,在此处依赖就相当于其他依赖于此模块的服务都将有服务注册发现功能-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

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

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

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

spring:
  application:
    name: mall-coupon

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

远程调用服务

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

  <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

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

//需要调用的微服务名
@FeignClient("mail-coupon")
public interface CouponFeignService {

    // 写完整地址需要调用的方法名
    @RequestMapping("/coupon/coupon/member/list")
    public R memberCoupons();
}

接下来在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);
    }

在这里插入图片描述

然后在会员服务的启动类上加上@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);
    }

}

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

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

配置中心

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

<dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
 </dependency>

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

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

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

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

member.user.name=lisi
member.user.age=18

在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<String, Object> 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();
    }

}

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

接下来就进入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

启动服务,访问接口测试
在这里插入图片描述
这就是使用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);
    }

}

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

# 可以配多个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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值