文章目录
- 背景
- 步骤
- 配置父pom文件
- spring-cloud和spring-cloud-alibaba的区别
- 添加网关模块
- 配置网关的application.yml文件
- 网关入口
- 普通模块
- 普通模块的配置文件:
- 普通模块的pom文件
- 启动类:
- application.yml文件和bootstrap.yml文件的区别
- 总结
背景
最近在做cloud项目,但是对于cloud项目的搭建还有有疑问的,所以尝试自己进行搭建并把自己遇到的问题进行总结。
步骤
接下来,我将自己是如何操作的一些步骤给总结和整理。
配置父pom文件
在配置pom文件之前首先要搭建一个空的maven项目。在父pom文件中加入依赖。
一、引入依赖:springcloud和cpringcloudalibaba依赖
<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>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
上面的代码中加入的依赖为spring-cloud-dependencies和spring-cloud-alibaba-dependencies
spring-cloud和spring-cloud-alibaba的区别
spring-cloud-alibaba是阿里巴巴开源的组件,主要包含了阿里巴巴在微服务方面的若干开源产品,spring-cloud-alibaba中的主要组件有:
- Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
- Dubbo:阿里巴巴开源的一个高性能Java RPC框架。
- RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
- Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
- Sentinel:阿里巴巴开源产品,一个控制微服务流量的开源框架。
除此之外,spring-cloud-alibaba还整合了Spring Cloud与上述组件,提供了更加完善的微服务解决方案,主要包含:
- Service Discovery:包含Nacos与Eureka的发现组件。
- Configuration:Nacos配置中心组件。
- Messaging:RocketMQ消息中间件的整合。
- Distributed Transaction:Seata的分布式事务支持。
- Circuit Breaker:Sentinel的熔断与限流支持。
- Gateway:与Spring Cloud Gateway的整合。
spring-cloud是Spring官方提供的微服务开发工具。它基于Spring Boot构建,提供了一系列框架和工具帮助我们快速构建分布式系统中的微服务架构。spring-cloud主要包含以下组件:
- Eureka:服务注册中心,用于服务注册与发现。
- Ribbon:负载均衡器,在服务调用方进行负载均衡。
- Feign:声明式 REST 客户端,简化 RESTful API 的调用。
- Hystrix:熔断器,容错管理工具,防止分布式系统中级联故障。
- Zuul:API 网关,用于认证、监控和路由转发等功能。
- Config:配置中心,通过Git仓库统一管理应用配置。
- Bus:事件总线,用于广播配置文件变更事件。
- Sleuth:调用链监控系统,用于跟踪微服务中的调用链信息。
- Stream:消息驱动微服务,简化消息系统的使用。
- Gateway:新的API网关,取代Zuul。
除此之外,spring-cloud还支持与第三方组件的整合,如:
- Kubernetes:容器编排平台的整合。
- Netflix组件:Ribbon、Hystrix、Zuul等。
- Zookeeper:服务注册发现与配置中心的支持。
- Consul:服务注册发现与配置中心的支持。
二者二维表比较:
标签是依赖管理它主要有以下作用:
- 声明依赖的版本号,让子项目的依赖使用相同版本号,实现版本锁定。这可以避免因依赖版本过高或过低导致的构建问题。
- 子项目继承自父项目,声明为dependencyManagement的依赖不会实际引入。子项目需要显式声明需要使用的依赖,并从父项目中继承正确的版本号。
- 如果子项目中没有声明依赖版本,默认会使用从dependencyManagement继承的版本,实现版本的一致管理。
- dependencyManagement只是声明依赖版本,并不实际引入那些依赖。因此,它不会对Maven构建过程产生实际影响。
二、引入spring-boot-starter-parent
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
</parent>
为什么要引入spring-boot-starter-parent?
统一管理各种依赖包的版本,避免版本冲突。
- 继承许多默认的Maven配置,简化pom文件。
- 能够使用Spring Boot提供的各种starter,快速构建应用。
- 不需要为许多依赖指定版本号,继承自parent的版本号。
举个例子,如果不使用这个父pom,我们在pom文件中需要声明的依赖信息会非常繁多,像下面这样
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.1.3.RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>2.1.3.RELEASE</version>
<optional>true</optional>
</dependency>
<!-- 省略更多... -->
</dependencies>
这样看起来就比较繁琐
而使用了spring-boot-starter-parent之后,pom文件简化为:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
</dependencies>
可以看到配置变得非常简单,这就是使用spring-boot-starter-parent的主要好处。
三、添加cloud版本号
<properties>
<!--cloud版本号-->
<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.8.RELEASE</spring-cloud-alibaba.version>
<java.version>11</java.version>
</properties>
到这里父pom就基本上配置完毕。
添加网关模块
右击项目–new–添加module,创建普通的manen项目
网关是cloud项目中所有模块的入口,所以它的配置和普通的配置略有不同。
一、添加依赖:
<dependencies>
<dependency>
<!-- gateway 注意 此模块不能引入starter-web -->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
pring-cloud-starter-alibaba-nacos-discovery是Spring Cloud Alibaba中关于Nacos服务发现的起步依赖。引入它可以让Spring Cloud应用使用Nacos作为服务注册与发现中心。
配置网关的application.yml文件
server:
# 该模块的端口号
port: 8080
spring:
application:
# 网关名称
name: gateway
profiles:
#指定环境
active: local
cloud:
gateway:
discovery:
locator:
enabled: true # 让gateway从nacos中获取服务信息
rotes:
- id: user_route #用户模块路由
uri: lb://test #test项目注册到nacos的服务名称,
order: 1
predicates:
- Path=/test/** #路由断言,用于判断请求是否符合转发条件。这里是判断请求路径是否以/test开头,如果是则转发到test服务
nacos:
discovery:
server-addr: nacos地址+端口号 #nacos地址
namespace: FilterTest
网关入口
@SpringBootApplication
@EnableDiscoveryClient //服务注册是否可以被发现
public class GateWayApplication {
public static void main(String[] args) {
SpringApplication.run(GateWayApplication.class,args);
}
}
普通模块
普通模块创建和网关模块创建是一样的。
普通模块的配置文件:
server:
port: 8082
servlet:
context-path: /test
spring:
application:
name: test
profiles:
active: local
cloud:
nacos:
discovery:
server-addr: nacos地址+端口号 #nacos地址
namespace: FilterTest
普通模块的pom文件
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
启动类:
@SpringBootApplication
@EnableDiscoveryClient
public class TestApplication {
public static void main(String[] args) throws UnknownHostException {
ConfigurableApplicationContext application =SpringApplication.run(TestApplication.class,args);
}
application.yml文件和bootstrap.yml文件的区别
该例子我搭建的cloud项目使用的配置文件使用的是application.yml,这里有一个优先级的问题,bootstrap.yml的优先级要比application.yml的优先级要高,而且一般使用熔断、限流之类的中间件的时候一般使用bootstrap.yml。
总结
本博客文中只是简单的搭建了一个cloud项目,如果在实际开发过程中需要用到其他的组件,在pom文件中引入相关依赖。
最后搭建完毕之后访问此:http://localhost:8080/test/test/TestController/test地址可以访问到自己的项目。需要说明一下,url地址中的第一个“/test”是网关中配置的地址,第二个test是自己模块中的上下文地址。