赞
踩
视频教程:https://www.bilibili.com/video/BV1np4y1C7Yf?p=4&spm_id_from=pageDriver&vd_source=0b3904471b2f8a3a133e05bd42f729a9
创建好项目选择需要的依赖,
创建完成后的结构
设置一个总项目,怕其他几个模块聚合起来。在添加到maven中
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.atguigu.gulimall</groupId> <artifactId>gulimall</artifactId> <version>0.0.1-SNAPSHOT</version> <name>gulimall</name> <description>聚合服务</description> <packaging>pom</packaging> <modules> <module>gulimall-coupon</module> <module>gulimall-member</module> <module>gulimall-order</module> <module>gulimall-product</module> <module>gulimall-ware</module> </modules> </project>
设置一下提交的git模板,避免提交垃圾文件
target/ pom.xml.tag pom.xml.releaseBackup pom.xml.versionsBackup pom.xml.next release.properties dependency-reduced-pom.xml buildNumber.properties .mvn/timing.properties # https://github.com/takari/maven-wrapper#usage-without-binary-jar .mvn/wrapper/maven-wrapper.jar **/mvnw **/mvnw.cmd **/.mvn **/target/ .idea **/.gitignore
然后直接提交到仓库
如题
下载生成的mybatis文件内容,导入gulimall-product项目中
如果在逆向生成的时候有你不需要的注解,可以修改生成的,模板即可
修改那个模板就改那个template然后重新运行导入
但是由于缺乏具体的工具类,所以还得新建一个组件共用的一个maven项目。
导入需要相关的工具依赖,例如mybatisplus
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.atguigu.gulimall</groupId> <artifactId>gulimall</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>gulimall-common</artifactId> <description>微服务的公共组件</description> <name>Archetype - gulimall-common</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.2.0</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.24</version> </dependency> </dependencies> </project>
然后前往product工程里面把这个项目共用的工具依赖加进去即可,在工具类里面补全缺少的工具依赖
<dependency>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
在common依赖中加载mysql以及servlet
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.atguigu.gulimall</groupId> <artifactId>gulimall</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>gulimall-common</artifactId> <description>微服务的公共组件</description> <name>Archetype - gulimall-common</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.2.0</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.24</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.17</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> </dependencies> </project>
spring:
datasource:
username: root
password: root
url: jdbc:mysql://192.168.81.128:3306/gulimall_pms?useUnicode=true&characterEncoding=UTF-8&useSSL=false
driver-class-name: com.mysql.jdbc.Driver
然后前往启动类添加注解
在application.yml添加
spring:
datasource:
username: root
password: root
url: jdbc:mysql://192.168.81.128:3306/gulimall_pms?useUnicode=true&characterEncoding=UTF-8&useSSL=false
driver-class-name: com.mysql.jdbc.Driver
mybatis-plus:
mapper-locations: classpath*:/mapper/**/*.xml
# 自增主键
global-config:
db-config:
id-type: auto
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用
微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布
式应用服务。依托 Spring CloudAlibaba, 您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用
接入阿里微服务解决方案,,通过阿里中间件来迅速搭建分布式应用系统。
为什么要用spring cloud alibaba
SpringCloud 的几大痛点
SpringCloud 部分组件停止维护和更新,给开发带来不便
SpinrgCloud部分环境搭建复杂,没有善的可视化界面,我们需要大量的二次开发和定制 SpringCloud配置复杂,难以上手,部分配置差别难以区分和合理应用
SpringCloud Alibaba 的优势
阿里使用过的组件经历了考验,性能强悍,设计合理,现在开源出来大家用 成套的产品搭配完善的可视化界面给开发运维带来极大的便利
搭建简单,学习曲线低。
结合 SpringCloud Alibaba 我们最终的技术搭配方案:
SpringCloud Alibaba - Nacos:注册中心(服务发现/注册)
SpringCloud Alibaba - Nacos:配置中心(动态配置管理)
SpringCloud - Ribbon:负载均衡
SpringCloud - Feign:声明式 HTTP 客户端(调用远程服务)
SpringCloud Alibaba - Sentinel:服务容错(限流、降级、熔断)
SpringCloud - Gateway:API 网 关 (webflux 编 程 模 式 )
SpringCloud - Sleuth:调用链监控
SpringCloud Alibaba - Seata:原 Fescar,即分布式事务解决方案
官方配置教程:
https://github.com/alibaba/spring-cloud-alibaba
官方配置教程:
https://github.com/alibaba/spring-cloud-alibaba/blob/2023.x/spring-cloud-alibaba-examples/nacos-example/readme-zh.md
导入注册发现依赖到common项目中加载依赖后其他服务也相当于拥有了服务注册发现功能
<!-- 服务注册/发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
下载nacos服务中心运行,因为是本机启动,需要修改startup,MODE修改为standalone修改成单机启动模式,不然用原来的集群启动会报错的。
在配置文件中指定注册中心的地址。改成nacos的8848端口。
spring:
datasource:
username: root
password: root
url: jdbc:mysql://192.168.56.10:3306/gulimall_sms
driver-class-name: com.mysql.jdbc.Driver
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
//注册中心的服务名
application:
name: gulimall-coupon
使用@EnableDiscoveryClient到启动类中添加注解。开启服务的注册发现功能
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallCouponApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallCouponApplication.class, args);
}
}
运行项目后就注册上来了。
添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
模拟一个远程服务,在Coupon项目中添加一个测试方法,用另一个项目通过feign来远程调用他。
@RequestMapping("/member/list")
public R membercoupons(){
CouponEntity couponEntity = new CouponEntity();
couponEntity.setCouponName("满100减10");
return R.ok().put("coupons",Arrays.asList(couponEntity));
}
在需要另一个需要使用feign的启动类添加注解,@EnableFeignClients(basePackages = “com.atguigu.gulimall.member.feign”)
package com.atguigu.gulimall.member; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; /** * 1、想要远程调用别的服务 * 1)、引入open-feign * 2)、编写一个接口,告诉SpringCloud这个接口需要调用远程服务 * 1、声明接口的每一个方法都是调用哪个远程服务的那个请求 * 3)、开启远程调用功能 */ @EnableFeignClients(basePackages = "com.atguigu.gulimall.member.feign") @EnableDiscoveryClient @SpringBootApplication public class GulimallMemberApplication { public static void main(String[] args) { SpringApplication.run(GulimallMemberApplication.class, args); } }
并且在创建一个feign文件夹里面创建接口
这个接口就是用来声明远程调用的,用来调用那个项目里面的接口。
package com.atguigu.gulimall.member.feign; import com.atguigu.common.utils.R; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping; /** * 这是一个声明式的远程调用 */ @FeignClient("gulimall-coupon") public interface CouponFeignService { @RequestMapping("/coupon/coupon/member/list") public R membercoupons(); }
现在模拟Member使用Feign来远程调用接口。
@Autowired
//feign类
CouponFeignService couponFeignService;
@RequestMapping("/coupons")
public R test(){
MemberEntity memberEntity = new MemberEntity();
memberEntity.setNickname("张三");
//远程调用接口,调用完成后会返回数据到实体类中
R membercoupons = couponFeignService.membercoupons();
return R.ok().put("member",memberEntity).put("coupons",membercoupons.get("coupons"));
}
注意
如果远程调用的服务不在nacos中的话是无法调用成功的。需要服务上线才能调用。
<!-- 配置中心来做配置管理-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
配置完成后在项目的 /src/main/resources/bootstrap.properties 中添加nacos的元数据;这个配置会优先于application加载。
Nacos 配置中心的主要特点如下:
集中管理:Nacos 配置中心提供了一个统一的配置管理界面,可以集中管理应用的配置信息,包括数据源、缓存、消息队列等各种配置。
动态刷新:Nacos 配置中心支持配置的动态刷新,当配置发生变化时,可以实时推送到客户端,无需重启应用。 版本控制:Nacos
配置中心支持配置的版本控制,可以方便地回滚到旧版本的配置。 高可用性:Nacos 配置中心具有高可用性,可以通过集群部署来保证服务的稳定性。
易于集成:Nacos 配置中心提供了丰富的客户端 SDK,可以方便地与各种编程语言和框架集成。
最主要的是他动态刷新功能,以往我们修改项目配置文件里面内容时候都得重新部署一遍才能看到效果,通过nacos配置文件动态刷新配置文件就可以解决这个问题,实现远程动态更新。
在nacos中创建远程配置
配置完成后项目的application将会被远程配置文件的配置所覆盖。先会读取nacos里面的配置。
之后每次只需要修改nacos里面的配置文件就行。
需要在用到动态更新的类中添加
@RefreshScope注解
@RefreshScope @RestController @RequestMapping("coupon/coupon") public class CouponController { @Autowired private CouponService couponService; @Value("${coupon.user.name}") private String name; @Value("${coupon.user.age}") private Integer age; @RequestMapping("/test") public R test(){ return R.ok().put("name",name).put("age",age); } } }
1)、命名空间:配置隔离;
* 默认:public(保留空间);默认新增的所有配置都在public空间。
* 1、开发,测试,生产:利用命名空间来做环境隔离。
* 注意:在bootstrap.properties;配置上,需要使用哪个命名空间下的配置,
* spring.cloud.nacos.config.namespace=9de62e44-cd2a-4a82-bf5c-95878bd5e871
* 2、每一个微服务之间互相隔离配置,每一个微服务都创建自己的命名空间,只加载自己命名空间下的所有配置
切换空间创建配置。每个空间的配置都是单独的。
让项目访问指定命名空间的配置文件。
在bootstrap配置文件下添加,添加后会访问指定空间的配置文件。如果不添加只会访问默认public命名空间的文件。
# Nacos 配置中心命名空间 id改成命名空间的id
spring.cloud.nacos.config.namespace=1986f4f3-69e0-43bb-859c-abe427b19f3a
也可以通过克隆来复制配置文件
2)、配置集:所有的配置的集合
*
* 3)、配置集ID:类似文件名。
* Data ID:类似文件名
*
* 4)、配置分组:
* 默认所有的配置集都属于:DEFAULT_GROUP;
* 1111,618,1212
配置文件进行分组,例如双十一组双十二组的配置文件。
配置文件中添加
# Nacos 配置中心分组
spring.cloud.nacos.config.group=prod
来控制nacos远程访问的分组,比如准备双十二了就通过双十二的分组来加载双十二的配置文件。通过分组后可以隔离开不同场景下的配置文件
也可以在开发环境下通过分组来区分不同测试环境的配置文件。
3、同时加载多个配置集
* 1)、微服务任何配置信息,任何配置文件都可以放在配置中心中
* 2)、只需要在bootstrap.properties说明加载配置中心中哪些配置文件即可
* 3)、@Value,@ConfigurationProperties。。。
* 以前SpringBoot任何方法从配置文件中获取值,都能使用。
* 配置中心有的优先使用配置中心中的,
把多个配置文件的数据元给拆分后放到nacos的配置集中来管理。
存放数据库的数据元
存放mybatis的
其他配置
把整个项目的配置都拆分成了这几个文件
在通过配置项目中的nacos配置文件来同时加载多个数据源
# 数据源配置 # 数据源的名字 spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml #分组 spring.cloud.nacos.config.ext-config[0].group=dev #是否支持动态刷新 不支持那么就不会随着nacos的更新而更新 spring.cloud.nacos.config.ext-config[0].refresh=true # MyBatis 配置 spring.cloud.nacos.config.ext-config[1].data-id=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].data-id=other.yml spring.cloud.nacos.config.ext-config[2].group=dev spring.cloud.nacos.config.ext-config[2].refresh=true
启动后可以看到他读取了那些配置文件
/** * 1、如何使用Nacos作为配置中心统一管理配置 * * 1)、引入依赖, * <dependency> * <groupId>com.alibaba.cloud</groupId> * <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> * </dependency> * 2)、创建一个bootstrap.properties。 * spring.application.name=gulimall-coupon * spring.cloud.nacos.config.server-addr=127.0.0.1:8848 * 3)、需要给配置中心默认添加一个叫 数据集(Data Id)gulimall-coupon.properties。默认规则,应用名.properties * 4)、给 应用名.properties 添加任何配置 * 5)、动态获取配置。 * @RefreshScope:动态获取并刷新配置 * @Value("${配置项的名}"):获取到配置。 * 如果配置中心和当前应用的配置文件中都配置了相同的项,优先使用配置中心的配置。 * * 2、细节 * 1)、命名空间:配置隔离; * 默认:public(保留空间);默认新增的所有配置都在public空间。 * 1、开发,测试,生产:利用命名空间来做环境隔离。 * 注意:在bootstrap.properties;配置上,需要使用哪个命名空间下的配置, * spring.cloud.nacos.config.namespace=9de62e44-cd2a-4a82-bf5c-95878bd5e871 * 2、每一个微服务之间互相隔离配置,每一个微服务都创建自己的命名空间,只加载自己命名空间下的所有配置 * * 2)、配置集:所有的配置的集合 * * 3)、配置集ID:类似文件名。 * Data ID:类似文件名 * * 4)、配置分组: * 默认所有的配置集都属于:DEFAULT_GROUP; * 1111,618,1212 * * 项目中的使用:每个微服务创建自己的命名空间,使用配置分组区分环境,dev,test,prod * * 3、同时加载多个配置集 * 1)、微服务任何配置信息,任何配置文件都可以放在配置中心中 * 2)、只需要在bootstrap.properties说明加载配置中心中哪些配置文件即可 * 3)、@Value,@ConfigurationProperties。。。 * 以前SpringBoot任何方法从配置文件中获取值,都能使用。 * 配置中心有的优先使用配置中心中的, * * */
完整配置文件
# 应用名称 spring.application.name=gulimall-coupon # Nacos 配置中心地址 spring.cloud.nacos.config.server-addr=127.0.0.1:8848 # Nacos 配置中心命名空间 spring.cloud.nacos.config.namespace=93362074-a698-42d9-9b75-c0a3aefea991 # Nacos 配置中心分组 # 优先覆盖application.properties里面的内容 spring.cloud.nacos.config.group=dev # 数据源配置 spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml spring.cloud.nacos.config.ext-config[0].group=dev spring.cloud.nacos.config.ext-config[0].refresh=true # MyBatis 配置 spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yaml 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].data-id=other.yml spring.cloud.nacos.config.ext-config[2].group=dev spring.cloud.nacos.config.ext-config[2].refresh=true
API网关在微服务架构中扮演着至关重要的角色,其主要功能如下:
通过这些功能,API网关为开发人员提供了一种集中且便捷的方式来发布、保护和管理微服务,使得大型复杂系统的演进和维护变得更加轻松。
创建一个新的模块项目选中Gateway来进行创建。
完整pom,如果遇到读取nacos地址为空的情况直接降低gatway版本
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.8.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.atguigu.gulimall</groupId> <artifactId>gulimall-gateway</artifactId> <version>0.0.1-SNAPSHOT</version> <name>gulimall-gateway</name> <description>API网关</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR3</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>com.atguigu.gulimall</groupId> <artifactId>gulimall-common</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
添加依赖,如果不加载这个依赖那么就无法使用nacos的注册发现服务。
<dependency>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
package com.gulimall.gateway; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * 开启服务注册发现 */ @EnableDiscoveryClient @SpringBootApplication public class GulimallGatewayApplication { public static void main(String[] args) { SpringApplication.run(GulimallGatewayApplication.class, args); } }
创建好application.properties配置文件
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=gulimall-gateway
server.port=88
创建好bootstrap.properties配置文件
spring.application.name=gulimall-coupon
# 配置中心的地址 nacos的地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=8516a6ce-7d54-4c7f-b704-3ef258ebaadd
在nacos中创建好其配置文件
根据配置定义一个路由,创建一个application.yml
spring:
cloud:
gateway:
routes:
- id: bd_route # 路由 ID,用于唯一标识该路由规则
uri: https://www.baidu.com # 目标服务的 URI
predicates: # 路由条件,用于匹配请求 Query是设置断言规则
- Query=url,baidu
- id: qq_route # 路由 ID,用于唯一标识该路由规则
uri: https://www.qq.com # 目标服务的 URI
predicates: # 路由条件,用于匹配请求 Query是设置断言规则
- Query=url,qq
http://localhost:88/hello?url=baidu
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。