小言_互联网的博客

Spring boot与Spring Cloud项目实战(一、分布式基础-SpringCloud Alibaba)

416人阅读  评论(0)


配置中心(SpringCloud config)
注册中心(SpringCloud netflix eurka)
API网关(SpringCloud netflix zuul)

1、SpringCloud Alibaba简介

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

依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里分布式应用解决方案,通过阿里中间件来迅速搭建分布式应用系统。
SpringCloud Alibaba Github地址

  • SpringCloud的几大缺点
    1.部分组件停止维护和更新给开发带来不便(eurka)
    2.部分环境搭建复杂,没有完善的可视化界面,需要大量的二次开发
    3.配置复杂难上手部分配置差别较细

  • SpringCloud Alibaba的优点
    阿里使用的组件经过实际考验,性能强悍,设计合理,开源成套的产品搭配完善的可视化界面给开发和运维带来极大便利,且搭建简单,学习难度低。

  • 结合SpringCloud Alibaba项目的最终的技术搭配方案

  • spring-cloud-alibaba版本的选择,见
    SpringCloud Alibaba Github地址

  • 在父项目pom文件中引入一

<!--   dependencyManagement实际不引用依赖只提供版本号与scope信息 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.1.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

2.spring Cloud Alibaba Nacos

  • 安装 Alibaba Nacos server
    下载Nacous Server并解压(这里为了方便我们放到本地window系统),运行bin/startup.cmd即可启动Nacous Server服务
    http://127.0.0.1:8848/nacos访问服务

2.1discovery(注册中心)

  • common模块引入依赖
 <dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
 </dependency>
  • 在应用的配置文件中配置服务名和Nacos Server 地址,
spring:
  application:
    name: wwmall-product
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  • 启动类标注@EnableDiscoveryClient即可将服务注册到nacous注册中心

2.2Config(配置中心)

2.2.1简单示例

  • common模块导入依赖,引入 Nacos Config Starter
<dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
 </dependency>
  • 在应用的 /src/main/resources/bootstrap.properties 配置文件中配置 Nacos Config 元数据
#该文件会优先于application.yml/application.properties加载
spring.application.name=wwmall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
  • 给配置中心默认添加一个数据集(Data Id的规则为:应用名.properties。例如wwmall-coupon.properties)
  • 将需要的配置文件写在数据集中并发布,即可动态获取
  • 动态获取:使用@RefreshScope(动态获取或刷新配置)和@Value("${配置项的名}")(获取配置)
@RefreshScope
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
    @Autowired
    private CouponService couponService;
/*---------------------测试代码start----------------------------------------------*/
    @Value("${coupon.user.name}")
    private String username;

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

    @RequestMapping("/test")
    public R test(){
       return R.ok().put("username",username).put("age",age);
    }

注:如果配置中心和当前应用的配置文件中由相同的项,则优先使用配置中心中的配置信息

2.2.2 命名空间与配置分组

  • 命名空间(Namespace):可用于进行不同环境的配置隔离。一般一个环境划分到一个命名空间
    默认的public为保留空间,默认新增的所有配置都在public空间
    1.在不同的环境(开发、测试、生产)利用命名空间来做环境隔离可以在bootstrap.properties配置需要使用哪个命名空间下的配置
    2.每一个微服务之间互相隔离,每个微服务创建自己的命名空间,只加载自己命名空间下的所有配置
#指定使用的命名空间
spring.cloud.nacos.config.namespace=ad0d2241-8cfc-4c30-a83f-1bd2c72eb62d
  • 配置分组(Group):配置分组用于将不同的服务可以归类到同一分组。一般将一个项目的配置分到一组
    默认所有的配置集都属于DEFAULT_GRUOP
    在bootstrap.properties中使用指定命名空间下的指定配置分组:
#指定使用的命名空间
spring.cloud.nacos.config.namespace=ad0d2241-8cfc-4c30-a83f-1bd2c72eb62d
#指定使用的分组
spring.cloud.nacos.config.group=dev
  • 配置集(Data ID):在系统中,一个配置文件通常就是一个配置集。一般微服务的配置就是一个配置集

本项目采用:每个微服务创建自己的命名空间,使用配置分组区分环境(desv,test,prod)

2.2.3加载多配置文件

配置文件不会全写在application.yml中会根据配置项分出多个配置集,我们关心在nacos中如何加载多个配置集
将配置文件拆分成多个datasource.yml,mybatis.yml,other.yml并在配置中心创建对应的配置集

  • 在bootstrap.properties说明加载配置中心中指定的配置集组
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

  • @value @configrationProperties等以前在springboot中能从配置文件中获取值的现在也可以使用。
    注:配置中心有的优先从配置中心取,没有的话就去项目的application.properties文件中取

3.Spring cloud组件

3.1Feign(声明式远程调用)

Feign是声明式的Http客户端,它让微服务之间的调用变得更简单了,Fegin提供了Http请求的模板,通过编写简单的接口和插入注解,就可以定义好Http请求的参数、格式、地址等信息。
Spring Cloud Fegin集成了Ribbon(负载均衡)Eureka(服务熔断),可在让我们不在显式的使用这两个组件。
Spring Cloud openFegin在NetfilxFeign基础上扩展了对SpringMVC注解的支持,在其实现下我们只需要创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口绑定,简化了Spring Cloud Ribbon自行封装服务调用客户端的开发量。

  • 引入依赖
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

模仿会员(wwmall-member)模块调用优惠券(wwmall-coupon)模块

  • 想要远程调用coupon模块的getCouponListByMemberId方法
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
    @Autowired
    private CouponService couponService;

    @RequestMapping("/member-coupon/couponList")
    public R getCouponListByMemberId(String memberName){
        CouponEntity couponEntity = new CouponEntity();
        couponEntity.setCouponName("五折优惠.....");
    return R.ok().put("memberName",memberName).put("couponEntity",Arrays.asList(couponEntity));
    }
  • 在会员模块编写一个接口,使用@Feign注解告诉springcloud这个接口需要调用远程服务,声明接口内的每一个方法是调用哪个远程服务的哪个请求
package com.walkwind.wwmall.member.feign;
@FeignClient("wwmall-coupon")
public interface CouponFeignService {

    @RequestMapping("/coupon/coupon/member-coupon/couponList")
    public R getCouponListByMemberId(String memberName);
}
  • 测试调用远程接口业务代码
@RestController
@RequestMapping("member/member")
public class MemberController {
    @Autowired
    private MemberService memberService;

    @Autowired
    CouponFeignService couponFeignService;

    @RequestMapping("/getCouponList")
     public R getCouponList(){
        R coupon = couponFeignService.getCouponListByMemberId("张三");
        return coupon;
    }
  • 使用@EnableFeignClients在启动类上注解开启远程调用功能

  • 运行项目测试远程调用功能(需开启Nacos服务)

3.2gateway网关

1.简介
网关作为流量的入口,常用功能包括路由转发、权限校验、限流控制。springcloud gateway作为springcloud官方推出的第二代网关框架,取代了zuul网关。
2.概念
Route(路由):这是网关的基本构建块。它由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。

Predicate(断言):这是一个 Java 8 的 Predicate。输入类型是一个 ServerWebExchange。我们可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。

Filter(过滤器):这是org.springframework.cloud.gateway.filter.GatewayFilter的实例,我们可以使用它修改请求和响应。

3.工作原理

客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。

4.使用gateway

  • 使用spring初始化向导创建wwmall-gateway模块引入gateway组件

  • 在pom文件中引入common模块,与

  • 将wwmall-gateway注册到nacos中
    1.开启注册发现服务功能
    2.配置文件中配置服务发现中心地址
    3.在nacos中配置命名空间与配置集
    4.配置文件中配置中心信息及使用的命名空间信息

测试网关配置


转载:https://blog.csdn.net/qq_35419179/article/details/105885458
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场