Spring Cloud Alibaba商城实战项目(day02)

news2024/5/18 4:13:27

四、搭建Spring Cloud Alibaba环境

4.1、简介

官方文档:https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/zh-cn/index.html

image-20230105192310592

我们所选用的组件:

  1. SpringCloud Alibaba - Nacos:注册中心(服务发现/注册)

  2. SpringCloud Alibaba - Nacos:配置中心(动态配置管理)

  3. SpringCloud - Ribbon:负载均衡

  4. SpringCloud - Feign:声明式 HTTP 客户端(调用远程服务)

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

  6. SpringCloud - Gateway:API 网关(webflux 编程模式)

  7. SpringCloud - Sleuth:调用链监控

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

4.2、注册服务(Nacos)

Nacos 使用三步:

  1. 导包 nacos-discovery。
  2. 写配置,指定 nacos 地址,指定应用的名字。
  3. 开启服务注册发现功能@EnableDiscoveryClient。

由于以后项目的依赖都有SpringCloud Alibaba,所以我们把依赖直接全部加到mall-common中。我们先加入一个版本管理。

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.6.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

引入我们选好的组件的依赖即可。

        <!--        服务注册/发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

    </dependencies>

接着去下载nacos-server,用于服务注册和发现。我们去官网下载nacos-server的压缩包。官网地址:https://github.com/alibaba/nacos/releases。下载完以后进入bin目录可以直接运行startup.cmd,即可启动nacos-server。

image-20230105194721657

image-20230105194829337

运行成功。

如果想要使用nacos-server我们还需要配置nacos的地址。

  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848

在启动类上加一个注解,表示允许开启服务发现。

package cn.linstudy.coupon;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
// 允许服务发现注解
@EnableDiscoveryClient
public class MallCouponApplication {

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

}

配置成功后,我们就可以通过http://127.0.0.1:8848/nacos/,访问nacos可视化中心,账号密码都是nacos。

image-20230105212142974

可以发现,服务已经注册上去了,这个服务名称就是我们这行配置的。

spring:
  application:
    name: mall-coupon

接下来我们依葫芦画瓢把其他服务也注册上去。

image-20230105212818390

大功告成!

4.3、远程调用(Feign)

Feign 使用三步:

  1. 导包 openfeign
  2. 开启@EnableFeignClients功能
  3. 编写接口,进行远程调用

4.3.1、简介

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

4.3.2、加入openfeign

首先先导入依赖。

        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <!--要记得加版本号,否则会报错-->
            <version>2.2.6.RELEASE</version>
        </dependency>

其次在启动类上写一个注解,开启openfeign。

package cn.linstudy.coupon;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
// 允许服务发现注解
@EnableDiscoveryClient
// 允许远程调用注解
@EnableFeignClients
public class MallCouponApplication {

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

}

4.3.3、测试

调用远程服务的步骤:

  1. 引入open-feign。
  2. 编写一个接口,告诉springcloud这个接口需要调用哪个远程服务。
  3. 声明接口的每一个方法都是调用哪个远程服务的哪个请求。
  4. 开启远程远程调用功能。在basePackages属性中书写远程调用包所在地方。

写一个优惠券的类去测试。

    // 测试openfrign
    @RequestMapping("test")
    public R memberCoupon(){
        CouponEntity couponEntity = new CouponEntity();
        couponEntity.setCouponName("俺是优惠券");
        return R.ok().put("coupons", Arrays.asList(couponEntity));
    }

我们通过mall-member服务来远程调用mall-coupon服务。CouponFeignService会先去nacos找mall-coupon这个服务,再去找/coupon/coupon/test接口的方法。那么项目启动后,就会去扫描feign下的对应的方法。

package cn.linstudy.member.feign;

import cn.linstudy.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;

// 告诉客户端我是远程调用客户端
@FeignClient("mall-coupon")
public interface CouponFeignService {

    // 把需要调用的方法签名复制一份即可
    @RequestMapping("/coupon/coupon/test")
    R memberCoupon();
}

最后在MemberController中写一个测试类即可。

    private CouponFeignService couponFeignService;
    @RequestMapping("/coupons")
    public R getCoupons(){
        R r = couponFeignService.memberCoupon();
        return R.ok().put("coupons",r.get("coupons"));
    }

直接浏览器访问:http://localhost:8000/member/member/coupons

image-20230105232311963

大功告成!

4.4、配置中心(Nacos Config)

当然Ncacos也可以作为配置中心(好处是修改了配置无需重启项目,把配置交给nocaos统一管理),首先需要引入依赖。直接CV丢到mall-common中。

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

Spring Cloud Alibaba在/src/main/resources下创建一个bootstrap.properties来s配置文件中配置 Nacos Config 元数据。来配置两个属性:

  1. spring.application.name:应用名字,一般用模块名来命名。
  2. spring.cloud.nacos.config.server-addr:nacos地址。
spring.application.name=mall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

然后启动nacos,将一些配置全部迁移到nacos中。

image-20230106105503268

将mall-coupon中的配置从yaml转到properties,并添加到nacos配置中,发布即可。

image-20230106105755188

4.4.1、概念

4.4.1.1、命名空间

命名空间用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的Group 或Data ID的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

4.4.1.2、配置集

一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。

4.4.1.3、配置集 ID

Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。

4.4.1.4、配置分组

Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如Buy 或Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如database_url 配置和MQ_topic 配置。

4.4.2、项目整合Nacos Config

如果我们把所有的配置都写在一个配置文件中,会显得配置文件很臃肿且不好维护,所以我们根据不同的功能来分开写。这个项目我们根据服务来隔离配置,首先先新建一个coupon优惠券命名空间。

image-20230106115225007

接着迁移mybatis-plus相关配置。

image-20230106115332147

将其他相关配置迁移就完成了。

image-20230106115454504

最后需要在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-plus.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

启动完发现端口还是配置好的7000且没有报错,目前是成果配置了。

image-20230106120254095

4.4.3、原理

4.4.3.1、自动注入

NacosConfigStarter 实现了 org.springframework.cloud.bootstrap.config.PropertySourceLocator 接口,并将优先级设置成了最高。 在 Spring Cloud 应用启动阶段,会主动从 Nacos Server 端获取对应的数据,并将获取到的数据转换成 PropertySource 且注入到 Environment 的 PropertySources 属性中,所以使用@Value 注解也能直接获取 Nacos Server 端配置的内容。

4.4.3.2、动态刷新

Nacos Config Starter 默认为所有获取数据成功的 Nacos 的配置项添加了监听功能,在监听到服务端配置发生变化时会实时触发 org.springframework.cloud.context.refresh.ContextRefresher 的 refresh 方法。如果需要对 Bean 进行动态刷新,请参照 Spring 和 Spring Cloud 规范。推荐给类添加@RefreshScope 或 @ConfigurationProperties 注解,

4.5、网关(Gateway)

网关作为流量的入口,常用功能包括路由转发、权限校验、限流控制等。而springcloud gateway作为 SpringCloud 官方推出的第二代网关框架,取代了 Zuul 网关。网关提供 API 全托管服务,丰富的 API 管理功能,辅助企业管理大规模的API,以降低管理成本和安全风险,包括协议适配、协议转发、安全策略、防刷、流量、监控日志等功能。Spring Cloud Gateway 旨在提供一种简单而有效的方式来对 API 进行路由,并为他们提供切面,例如:安全性,监控/指标 和弹性等。 官方文档地址: https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.1.3.RELEASE/single/spring-cloud-gateway.html

Spring Cloud Gateway 特点:

  1. 基于 Spring5,支持响应式编程和 SpringBoot2.0。
  2. 支持使用任何请求属性进行路由匹配。
  3. 特定于路由的断言和过滤器。
  4. 集成 Hystrix 进行断路保护。
  5. 集成服务发现功能。
  6. 易于编写 Predicates 和 Filters。
  7. 支持请求速率限制。
  8. 支持路径重写。

4.5.1、整合网关

我们首先先创建一个网关服务,同时网关服务也是需要交给nacos管理,所以也需要配置nacos相关配置,包括写注解配置和告知网关服务,nacos的地址。

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

在启动类上加一个注解。

package cn.linstudy.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class MallGatewayApplication {

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

}

引入依赖后就可以开始测试了。

        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-gateway -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

启动后会出现这个错误。

image-20230106213605044

因为我们是网关层,不需要数据源相关配置,所以我们直接把他排除掉即可。在启动类上注解里面排除即可。

@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})

一启动,就会有惊喜!

image-20230106230932888

image-20230106230943230

这里会遇到一个bug,由于gateway与springboot-web会有冲突,我们需要把他排除掉,但是我们不可以在父项目中排除,因为其他的项目还需要用到,所以我们需要在引入mall-common的地方排除掉springboot-web。

<dependency>
            <groupId>cn.linstudy</groupId>
            <artifactId>mall-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

image-20230106231134907

大功告成!

4.5.2、测试

在application.yml中可以书写网关规则。

spring:
  cloud:
    gateway:
      routes:
#          路由规则名称
        - id: test_route
          uri: https://www.baidu.com
#          断言,Query=url表示如果有url这个参数,且url的值等于baidu就跳到这个url
          predicates:
            - Query=url,baidu
        #          路由规则名称
        - id: qq_route
          uri: https://www.qq.com
          #          断言,Query=url表示如果有url这个参数,且url的值等于qq就跳到这个url
          predicates:
            - Query=url,qq

启动后输入

image-20230106182148456.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/164168.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

还不会二分查找?看这一篇就够了

目录一、整数二分1.1 二分查找模板1.1.1 寻找右边界的二分查找1.1.2 寻找左边界的二分查找1.2 应用&#xff1a;寻找元素的起始位置和终止位置二、浮点数二分2.1 浮点数二分模板2.2 应用&#xff1a;数的三次方根三、使用STL进行二分查找3.1 std::binary_search3.2 std::lower_…

27-Golang中的错误处理机制

Golang中的错误处理机制说明基本说明使用deferrecover处理上述代码错误处理机制的好处自定义错误说明 package main import ("fmt" )func test() {num1 : 10num2 : 0res : num1 / num2fmt.Println("res", res) }func fmt() {test ()fmt.Println("mai…

分享77个Java源码,总有一款适合您

Java源码 分享77个Java源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;大家下载后可以看到。 源码下载链接&#xff1a;https://pan.baidu.com/s/1EhB4snvWia5eCztyfiX_2A?pwdbofo …

wish、亚马逊、ebay、沃尔玛自养号测评补单优势之分析技巧

测评补单的资源可以说是卖家非常宝贵的财富&#xff0c;通过测评补单和广告相结合&#xff0c;可以快速有效的提升店铺的产品销量&#xff0c;提高转化&#xff0c;提升listing权重&#xff0c;如果是做自养号还可以不用担心以后被别人牵制&#xff0c;毕竟资源掌握在自己手上&…

docker-基础实战第二课

Docker三剑客 Docker 镜像&#xff08;Image&#xff09;&#xff1a;镜像可以用来创建容器&#xff0c;一个镜像可以创建多个容器。 容器&#xff1a;容器实例就是指实际运行的实例&#xff0c;可以理解为镜像是java的类&#xff0c;容器就是new出来的对象。 仓库&#xff1a;…

elasticsearch实现基于拼音搜索

1、背景 一般情况下&#xff0c;有些搜索需求是需要根据拼音和中文来搜索的&#xff0c;那么在elasticsearch中是如何来实现基于拼音来搜索的呢&#xff1f;可以通过elasticsearch-analysis-pinyin分析器来实现。 2、安装拼音分词器 # 进入 es 的插件目录 cd /usr/local/es/…

【论文阅读 CIKM2011】Finding Dimensions for Queries

文章目录ForewordAbsMethodList ExtractionList WeightingList ClusteringDimension and Item RankingForeword This paper is from CIKM2011, so we only condier the method, not resultsThere are many papers that have not been shared. More papers can be found in: Sh…

微信小程序+阿里物联/Onenet物联+esp32搭建无服务器物联系统(一)---ESP32硬件设计开源

目录 简介 一、硬件设计开源连接 二、硬件设计解析 1、电路原理图 2、PCB版图 3、BOM资料 4、整体项目的资料连接 微信小程序阿里物联平台合宙Air724UG搭建无服务器物联系统&#xff08;一&#xff09; 微信小程序阿里物联平台合宙Air724UG搭建无服务器物联系统&#xff08…

uni-app canvas绘制海报流程的一些记录

绘制流程 布局定义 在我们的布局里要声明canvas的定义如下&#xff0c;可以声明class布局样式&#xff0c;width和height是必须的&#xff0c;因为如果没有就绘制不了。 canvas-id也是必须的&#xff0c;我们需要通过id找到对一个你的canvas对象&#xff0c;来做操作 <c…

公测开启!CRMEB 多商户v2.1新功能快来体验

“ 真正实现完美主义当然很困难&#xff0c;但具备追求完美主义的态度&#xff0c;就能减少错误。” ——稻盛和夫 CRMEB 多商户 v2.1公测版正式发布&#xff01;新增付费会员&#xff0c;可进行会员折扣价管理、会员福利设置&#xff1b;新增社区发布短视频&#xff0c;打造短…

Django REST framework--DRF视图

Django REST framework--DRF视图DRF视图编写常规Django视图编写视图装饰器api_view查询资源返回所有数据返回单条数据返回json格式的数据新增资源修改资源删除资源DRF视图编写 常规Django视图编写 序列化器最终的作用是为视图提供转化后的数据&#xff0c;可使用Serializer类…

【饥荒】本地服务器+内网穿透

本地服务器搭建方法 准备工具 网易UU加速器&#xff08;用于加速科雷官网登陆和steam创意工坊&#xff09;Don’t Starve Together Dedicated Server(steam饥荒联机版开服工具) 获取方法&#xff1a;在库中勾选工具&#xff0c;然后搜索Don’t Starve Together Dedicated Ser…

Unity SRP自定义渲染管线学习1.2:初步绘制

绘制物体 绘制物体&#xff0c;包括不透明的物体&#xff0c;透明物体&#xff0c;再加上之前的天空盒 Camera void DrawVisibleGeometry(){//我们需要将不透明物体和透明物体分开绘制//如果我们直接先绘制所有的物体&#xff0c;然后再绘制天空盒&#xff0c;我们就会看到对…

nodejs+vue家庭食谱饮食方案管理系统网站python php java

本系统分为用户和管理员两个角色&#xff0c;其中用户可以注册登陆系统&#xff0c;查看美食食谱&#xff0c;一周健康食谱安排&#xff0c;查看美食食材&#xff0c;在线交流发布帖子&#xff1b;管理员可以对食谱分类&#xff0c;食谱信息&#xff0c;材料信息&#xff0c;美…

区块链技术2---BTC的数据结构

1&#xff1a;Hash pointers&#xff08;哈希指针&#xff09;和普通指针相比&#xff0c;哈希指针除了保存地址还保存哈希值2&#xff1a;Block chain区块链中的区块通过哈希指针相连&#xff0c;这里的哈希指针的哈希值是对前一个区块的整体取哈希值&#xff08;包括前一个区…

linux系统中使用QT实现摄像头功能的方法

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何使用QT中的Camera的功能和实现。 目录 第一&#xff1a;摄像头资源简介 第二&#xff1a;环境搭建要求 第三&#xff1a;代码编译实现要求 第一&#xff1a;摄像头资源简介 开发板上有一路“CSI”摄像头接口&#xf…

组件封装 - steps组件

首先, 我先来看看效果 steps 组件的封装和 tabs 组件还是相似的 都会去指定两个组件来完成(仿Element UI), 都会去使用 jsx 的语法 让其中一个组件去规定样式和排版, 另外一个组件去接收父组件传入的动态数据 但和面包屑组件还是有区别的(面包屑组件封装): 相同点都是使用两…

v-for 的“就地更新”策略

前言 我们平时使用v-for的时候通常都是加一个唯一标识key&#xff0c;因为不加的时候Vue会给我们发出警告。其实我们加上key的操作&#xff0c;就是为了避免它的“就地更新”策略。我们来看一下官网对“就地更新”的解释&#xff1a; 当 Vue 正在更新使用 v-for 渲染的元素列表…

jsp文化活动系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 文化活动系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统采用web模式开发&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数…

第4章 任务看门狗

任务看门狗 主任务死循环 在app_main任务中死循环 #include <stdio.h> #include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h"const char *TAG "COUNTER";int count 0;void app_main(void) {wh…