电商项目——分布式组件(SpringCloud Alibaba,SpringCloud)——第七章——上篇

电商项目——初识电商——第一章——上篇
电商项目——分布式基础概念和电商项目微服务架构图,划分图的详解——第二章——上篇
电商项目——电商项目的虚拟机环境搭建_VirtualBox,Vagrant——第三章——上篇
电商项目——Linux虚拟机中安装docker,mysql,redis_VirtualBox——第四章——上篇
电商项目——电商项目的环境搭建_开发工具&环境搭建——第五章——上篇
电商项目——快速开发人人开源搭建后台管理系统&代码生成器逆向工程搭建——第六章——上篇
电商项目——分布式组件(SpringCloud Alibaba,SpringCloud)——第七章——上篇
电商项目——前端基础——第八章——上篇
电商项目——商品服务-API-三级分类——第九章——上篇
电商项目——商品服务-API-品牌管理——第十章——上篇
电商项目——商品服务-API-属性分组——第十一章——上篇
电商项目——商品服务-API-品牌管理——第十二章——上篇
电商项目——商品服务-API-平台属性——第十三章——上篇
电商项目——商品服务-API-新增商品——第十四章——上篇
电商项目——商品服务-API-商品管理——第十五章——上篇
电商项目——商品服务-API-仓库管理——第十六章——上篇

文章目录

  • 1:前言
  • 2:SpringCloud Alibaba简介
  • 2.1 如何整合alibaba进入到我们的项目
  • 3:SpringCloud Alibaba-Nacos注册中心-简单示例
    • 3.1 第一步:修改pom.xml文件,引入Nacos Discovery Starter
    • 3.2 在应用的/src/main/resources/application.properties配置文件中配置Nacos Server地址
    • 3.3 使用@EnableDiscoverClient注解开启服务注册与发现功能
    • 3.4 启动mall-coupon进行测试
  • 4:SpringCloud OpenFeign远程调用-简单示例
    • 4.1 第一步:引入依赖
    • 4.2 第二步:声明远程式接口@FeignClient
    • 4.3 第三步:开启远程调用功能@EnableFeignClients
  • 5:SpringCloud Alibaba 配置中心-简单示例
    • 5.1 第一步:引入Nacos config Starter依赖
    • 5.2 第二步:在应用的/src/main/resources/bootstrap.properties配置文件中配置Nacos config元素
    • 5.3 第三步:完成上述两步后,应用会从Nacos Config中获取相应的配置,
    • 5.4 SpringCloud Alibaba 配置中心-命名空间与配置分组
    • 5.5 SpringCloud Alibaba 配置中心-加载多配置集
  • 6:SpringCloud Gateway网关核心概念&原理
    • 6.1 创建测试API网关
    • 6.2 注意一个Description:failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.这个问题

讲述前六章的内容以后,有了一定的积淀,我们就可以开始搭建分布式系统的基本环境

1:前言

在分布式开发中,我们要先知道微服务-注册中心,配置中心,网关三个概念

  • 注册中心: 在分布式开发里面,我们有各个微服务,我们都应该将他们注册到注册中心,这样做的好处是,如果订单服务调用商品服务,那么我们可以去注册中心看一下那些商品服务被注册进来了,订单服务可以随便挑一个商品服务进行远程调用(大白话解释)
  • 配置中心:各个微服务的配置众多,比如商品微服务在10台机器上,我们想要改某一个商品的配置,都要改就很麻烦,我们希望有一个配置中心来集中管理配置,所有商品服务从配置中心获取配置,配置中心改掉一个配置,商品服务就可以实时修改(大白话解释)
  • 网关:所有前端请求通过网关(匹配,过滤),抵达其他服务(大白话解释)
    电商项目——分布式组件(SpringCloud Alibaba,SpringCloud)——第七章——上篇_第1张图片

2:SpringCloud Alibaba简介

SpringCloud Alibaba官方文档

  • Spring Cloud Alibaba致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用
    微服务的必需组件,方便开发者通过Spring Cloud 编程横型轻松使用这些组件来开发分布
    式应用服务。

  • 依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将Spring Cloud应用。接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
    https://github.com/alibaba/spring-cloud-alibaba

  • SpringCloud 的几大痛点

SpringCloud 部分组件停止维护和更新。给开发者来不便;
SpringCloud部扮环境搭建复杂,没有完善的可视化界面,我们需要大量的二次开发和定制
SpringCloud配置复杂。难以上手,部分配置差别难以区分和合理应用
  • SpringCloud Alibaba 的优势,
阿里使用过的组件经历了考验,性能强悍,设计合理,现在开源出来大家用
成套的产品搭配完善的可视化界面给开发运维蒂来极大的便利
搭建简单,学习曲线低
  • 结合SpringCloud Alibaba我们最终的技术搭配方案;
SpringCloud Allbaba-Nacos:注册中心(服务发现/注册)
SpringCloud Alibaba- Nacos.配置中心(动态配置管理)

SpringCloud-Ribbon:负载均衡
SpringCloud- Feign.声明式HTP客户端(调用远程服务)

SpringCloud Alibaba- Sentinel:服务容错(限流、降级、熔断)

SpringCloud- Gateway. API网关(webflux编程模式)
Springcloud-Sleuth:调用链监控

SpringCloud Alibaba-Seata:原Fescar,即分布式事务解决方案

2.1 如何整合alibaba进入到我们的项目

第一步:注意版本
在这里插入图片描述
第二步:在mall-common中引入如下依赖

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-alibaba-dependenciesartifactId>
                <version>2.1.0.RELEASEversion>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>

3:SpringCloud Alibaba-Nacos注册中心-简单示例

我们先了解一下Spring Cloud应用如何接入Nacos Discovery

3.1 第一步:修改pom.xml文件,引入Nacos Discovery Starter

在mall-common中引入如下的配置

        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
        dependency>

3.2 在应用的/src/main/resources/application.properties配置文件中配置Nacos Server地址

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
  application:
    name: mall-coupon

3.3 使用@EnableDiscoverClient注解开启服务注册与发现功能

示例,在mall-coupon中开启服务注册于发现功能

@EnableDiscoveryClient
@MapperScan("com.atstudying.mall.coupon.dao")
@SpringBootApplication
public class MallCouponApplication {

	public static void main(String[] args) {
		SpringApplication.run(MallCouponApplication.class, args);
	}

}

3.4 启动mall-coupon进行测试

第一步:去nacos中打开bin,点击startup执行
要在mall-coupon中配置application name,以便Nacos的可视化界面可以找到微服务的服务名

spring:
  application:
    name: mall-coupon

第二步:访问localhost:8848
电商项目——分布式组件(SpringCloud Alibaba,SpringCloud)——第七章——上篇_第2张图片

4:SpringCloud OpenFeign远程调用-简单示例

  • Feign是一个声明式的HTTP客户端,它的目的就是让远程调用更加简单。Feign提供了HTTP请求的模板。通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。
  • Feign整合了Ribbon (负载均衡)和Hyrix服务熔断可以让我们不再需要显式地使用这
    两个组性。
  • SpringCloudFeign在NetlflixFeign的基础上扩展了对SpringMVC注解的支持。在其实现下,我们只需创建一个接口并用注解的方式来配置它。即可完成对服务提供方的接口绑定。简化了SpringClouRibbon自行封装服务调用客户端的开发量。

小例子:mall-member微服务调用mall-coupon服务,比如会员想要从优惠劵中获取优惠的信息,就要进行远程调用
电商项目——分布式组件(SpringCloud Alibaba,SpringCloud)——第七章——上篇_第3张图片

4.1 第一步:引入依赖

在mall-member中引入Open Feign

		<dependency>
			<groupId>org.springframework.cloudgroupId>
			<artifactId>spring-cloud-starter-openfeignartifactId>
		dependency>

4.2 第二步:声明远程式接口@FeignClient

声明远程式接口,告诉SpringCloud这个接口需要调用远程服务,声明接口的每一个方法调用的是哪个远程服务的那个请求
mall-member

//声明了一个CouponFeignService 远程式接口,声明接口的memberCoupom方法调用的是mall-coupon 中的/coupon/coupon/member/list
@FeignClient("mall-coupon")
public interface CouponFeignService {
    @RequestMapping("/coupon/coupon/member/list")
    public R memberCoupom();
}

mall-coupon中编写一个方法供mall-member调用

@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
    @Autowired
    private CouponService couponService;

    @RequestMapping("/member/list")
    public R memberCoupom(){

        CouponEntity couponEntity=new CouponEntity();
        couponEntity.setCouponName("zlj");
        couponEntity.setCouponType(2);
        return R.ok().put("ok",Arrays.asList(couponEntity));

    }

4.3 第三步:开启远程调用功能@EnableFeignClients

@EnableFeignClients(basePackages = "com.atstudying.mall.member.Feign.CouponFeignService")
@EnableDiscoveryClient
@SpringBootApplication
public class MallMemberApplication {

	public static void main(String[] args) {
		SpringApplication.run(MallMemberApplication.class, args);
	}

}

5:SpringCloud Alibaba 配置中心-简单示例

5.1 第一步:引入Nacos config Starter依赖

        

        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-alibaba-nacos-configartifactId>
        dependency>

5.2 第二步:在应用的/src/main/resources/bootstrap.properties配置文件中配置Nacos config元素

在mall-coupon中演示
bootstrap.properties会优先于application.properties加载
例子证明:
application.properties

coupon.user.name=zlj
coupon.user.age=20

提示:如果直接user.name=zlj,浏览器不会给你zlj,而是你系统变量的名字,为了区分开来,我们要写上前缀,比如coupon
测试:

http://localhost:20000/coupon/coupon/test
{"msg":"success","code":0,"name":"zlj","age":"20"}

我们在配置一个bootstrap.properties
配置如下两个文件

spring.application.name=mall-coupon
spring.cloud.nacos.config.server-name=localhost:8848

Nacos配置中心
mall-coupon.properties

coupon:
  user:
    name:zhangsan
    age: 22
http://localhost:20000/coupon/coupon/test
{"msg":"success","code":0,"name":"name:zhangsan","age":"22"}

5.3 第三步:完成上述两步后,应用会从Nacos Config中获取相应的配置,

完成上述两步后,应用会从Nacos Config中获取相应的配置,并添加在Spring Environment的PropertySources中。这里我们使用@Value注解来将对应的配置注入到CouponController 的userName和age字段。井添加@RefreshScope打开动态刷新功能

@RestController
@RefreshScope
@RequestMapping("coupon/coupon")
public class CouponController {
    @Autowired
    private CouponService couponService;

    @Value("${coupon.user.name}")
    private String name;
    @Value("${coupon.user.age}")

    private String age;
    //测试nacos config
    @RequestMapping("/test")
    public R test(){

        return R.ok().put("name",name).put("age",age);
    }

5.4 SpringCloud Alibaba 配置中心-命名空间与配置分组

  • 命名空间

(1)开发,测试,生产,利用命名空间来做环境隔离。
注意。在bootstrap. propertiesi配置上,需要使用哪个命名空间下的配置

spring.cloud.nacos.config.namespace=3dc59cad-5171-42a2-9e56-eb7b69c5f790

(2).每一个微服务之间互相隔高配置。每一个微服务都创建自己的命名空间。只加载自己命名空间下的所有配置

  • 配置集,所有的配置的集合
  • 配置集ID,类似文件名。
  • 配置分组,开发,测试,生产,利用命名空间来做环境隔离。

默认所有的配置集 都属于,DEFAULT GROUP:

每个微服务创建自的命名空间,使用配置分组区分环境,dev, test. prod

5.5 SpringCloud Alibaba 配置中心-加载多配置集

在这里插入图片描述
电商项目——分布式组件(SpringCloud Alibaba,SpringCloud)——第七章——上篇_第4张图片
mall-coupon
bootstrap.properties

spring.application.name=mall-coupon
spring.cloud.nacos.config.server-addr=192.168.232.1:8848
spring.cloud.nacos.config.namespace=56551c3c-d75a-41ea-8b72-349326b483c9
#spring.cloud.nacos.config.group=

spring.cloud.nacos.config.ext-config[0].dataId=datasource.yml
spring.cloud.nacos.config.ext-config[0].group=dev
spring.cloud.nacos.config.ext-config[0].refresh=true

spring.cloud.nacos.config.ext-config[1].dataId=mybatis.yml
spring.cloud.nacos.config.ext-config[1].group=dev
spring.cloud.nacos.config.ext-config[1].refresh=true

spring.cloud.nacos.config.ext-config[2].dataId=Nacos.yml
spring.cloud.nacos.config.ext-config[2].group=dev
spring.cloud.nacos.config.ext-config[2].refresh=true

spring.cloud.nacos.config.ext-config[3].dataId=test1.properties
spring.cloud.nacos.config.ext-config[3].group=test
spring.cloud.nacos.config.ext-config[3].refresh=true

进行测试

@RestController
@RefreshScope
@RequestMapping("coupon/coupon")
public class CouponController {
    @Autowired
    private CouponService couponService;

    @Value("${coupon.user.name}")
    private String name;
    @Value("${coupon.user.age}")

    private String age;
    //测试nacos config
    @RequestMapping("/test")
    public R test(){

        return R.ok().put("name",name).put("age",age);
    }
{"msg":"success","code":0,"name":"test","age":"18"}

更改nacos中心的配置,可以完成自动修改

{"msg":"success","code":0,"name":"testchange","age":"18"}

6:SpringCloud Gateway网关核心概念&原理

电商项目——分布式组件(SpringCloud Alibaba,SpringCloud)——第七章——上篇_第5张图片
电商项目——分布式组件(SpringCloud Alibaba,SpringCloud)——第七章——上篇_第6张图片

  • 网关作为流量的入口,常用功能包括路由转发、权限校验、限流控制等。而spingcloud gateway网关作为SpringCloud官方推出的第二代网关框架,取代了Zuul网关。
    网上测试对比结果

  • SpringCloud Gateway的三个术语
    路由:网关的基本构件。它由一个ID、一个目标URI、一个谓词集合和一个过滤器集合定义。如果聚合谓词为真,则匹配路
    断言:这是一个Java 8函数谓词。输入类型是Spring Framework ServerWebExchange。这使我们可以匹配来自HTTP请求的任何内容,例如头或参数。
    Filter:这些是Spring Framework GatewayFilter的实例,使用特定的工厂构造。在这里,我们可以在发送下游请求之前或之后修改请求和响应。
    电商项目——分布式组件(SpringCloud Alibaba,SpringCloud)——第七章——上篇_第7张图片

在这里插入图片描述

  • SpringCloud Gateway特点
构建于Spring Framework 5、Project Reactor和Spring Boot 2.0之上
能够匹配任何请求属性上的路由。
谓词和过滤器是特定于路由的。
Hystrix断路器集成。
Spring Cloud发现客户端集成
易于编写谓词和过滤器
请求速率限制
路径重写

6.1 创建测试API网关

  1. 在zlj-mall中新建一个子项目mall-gateway

我们要引入mall-common依赖,因为网关既要注册中心也要配置中心,都在mall-common中有配置,还要引入网关依赖

//....

		
			com.atstudying.mall
			mall
			0.0.1-SNAPSHOT
		
		
			org.springframework.cloud
			spring-cloud-starter-gateway
		
  1. 我们把所有的配置都写在了配置中心中
spring.application.name=mall-gateway
spring.cloud.nacos.config.server-addr=localhost:8848

spring.cloud.nacos.config.namespace=3787d0b6-aedf-458e-996a-714234a7fe55

spring.cloud.nacos.config.ext-config[0].dataId=basic.yaml
spring.cloud.nacos.config.ext-config[0].group=dev
spring.cloud.nacos.config.ext-config[0].refresh=true

spring.cloud.nacos.config.ext-config[1].dataId=gateway.yaml
spring.cloud.nacos.config.ext-config[1].group=dev
spring.cloud.nacos.config.ext-config[1].refresh=true
  1. MallGatewayApplication
@EnableDiscoveryClient
@SpringBootApplication
public class MallGatewayApplication {

	public static void main(String[] args) {
		SpringApplication.run(MallGatewayApplication.class, args);
	}

}
  1. 测试,输入qq或者wechat任一路径或者qq/ **,wechat/ **都可以返回百度这个网站

gateway.yaml

spring:
  cloud:
    gateway:
      routes:
      - id: path_route
        uri: https://www.baidu.com
        predicates:
        - Path=/qq/**,/wechat/**

6.2 注意一个Description:failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured.这个问题

因为我们的mall-gateway整合了mall-common的所有依赖,可是网关不需要配置数据源(不需要网关的mybatis,有了就会报错)

com.baomidou
					mybatis-plus-boot-starter

两种解决方法:

  1. 在mall-gateway中排除掉mybatis的依赖
<dependency>
			<groupId>com.atstudying.mallgroupId>
			<artifactId>mall-commonartifactId>
			<version>0.0.1-SNAPSHOTversion>
			<exclusions>
				<exclusion>
					<groupId>com.baomidougroupId>
					<artifactId>mybatis-plus-boot-starterartifactId>
				exclusion>
			exclusions>
		dependency>
  1. 在mall-gateway主程序类中排除自动配置
@EnableDiscoveryClient
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MallGatewayApplication {

	public static void main(String[] args) {
		SpringApplication.run(MallGatewayApplication.class, args);
	}

}

你可能感兴趣的:(电商项目)