Spring Cloud Alibaba 综合集成架构
Spring Cloud Alibaba 综合集成架构
Feign在高并发下性能不如RPC框架Dubbo, 所以用nacos+Dubbo,
- 网关和应用间用Feign
- 应用和微服务之间,各微服务之间,用dubbo
组件说明
API网关 :系统统一入口,屏蔽架构内部结构,统一安全拦截,采用Zuul实现。
application-1 :应用1,模拟应用,提供http接口服务。
service-1 :微服务1,模拟微服务,提供dubbo接口服务。
service-2 :微服务2,模拟微服务,提供dubbo接口服务。
调用流程
所有访问系统的请求都要经过网关,网关转发Http请求至application-1,application-1使用dubbo调用service1完成自身业务,而后sevice1调用service2完成自身业务。至此,完成所有组件贯穿
**架构中application与sevice的区别是什么? **
- service提供了基础服务功能;application组装基础服务功能,提供给用户直接可用的业务。
- service服务粒度小、功能基础,不易发生改变;application提供上游业务功能,紧贴业务需求,容易发生改 变。
- 形成service支撑application的整体架构,增加多变的application甚至不需要变动service。
工程结构
nacos‐micro‐service 整体父工程
├─api‐gateway API网关,端口:56010
├─application‐1 应用1,端口:56020
├─service‐1 服务1父工程
│ ├─service‐1‐api 服务1API
│ └─service‐1‐server 服务1实现,端口:56030
├─service‐2 服务2父工程
│ ├─service‐2‐api 服务2API
│ └─service‐2‐server 服务2实现,端口:56040
代码
父工程nacos-micro-servcie
依赖
<?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.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<packaging>pom</packaging>
<modules>
<module>application-1</module>
<module>service-1</module>
<module>service-2</module>
<module>api-gateway</module>
</modules>
<groupId>com.example</groupId>
<artifactId>nacos-micro-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>nacos-micro-service</name>
<description>nacos-micro-service</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
application-1
依赖
<parent>
<artifactId>nacos-micro-service</artifactId>
<groupId>com.example</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>service-1-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
bootstrap.yml
server:
port: 56020
servlet:
context-path: /application1 # 访问路径
spring:
application:
name: application1
main:
allow-bean-definition-overriding: true # Spring Boot 2.1 ????
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
namespace: 2d108db1-4b7b-4175-8012-be00d735ea8a
group: NACOS_MICROSERVICE_GROUP
file-extension: yaml
discovery:
server-addr: 127.0.0.1:8848
namespace: 2d108db1-4b7b-4175-8012-be00d735ea8a
cluster-name: DEFAULT
功能接口
@RestController
public class Application1Controller {
@org.apache.dubbo.config.annotation.Reference
private ConsumerService consumerService;
@GetMapping("service")
public String service() {
return "test" + consumerService.service();
}
}
启动类
@SpringBootApplication
@EnableDiscoveryClient
public class Application1Application {
public static void main(String[] args) {
SpringApplication.run(Application1Application.class, args);
}
}
servcie-1父工程
<packaging>pom</packaging>
<modules>
<module>service-1-api</module>
<module>service-1-server</module>
</modules>
servcie-1-api
为了方便其它服务调用dubbo服务,专门定义api工程,此工程将作为jar被其它工程依赖。
依赖
<parent>
<artifactId>service-1</artifactId>
<groupId>com.example</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
服务接口
public interface ConsumerService {
String service();
}
servcie-1-server
依赖
<parent>
<artifactId>service-1</artifactId>
<groupId>com.example</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--service1-api 要实现server-1-api-->
<dependency>
<groupId>com.example</groupId>
<artifactId>service-1-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-dubbo -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<!--要调用servcie-2-api-->
<dependency>
<groupId>com.example</groupId>
<artifactId>service-2-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
bootstrap.yml
server:
port: 56030
spring:
application:
name: service1
main:
allow-bean-definition-overriding: true
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: 2d108db1-4b7b-4175-8012-be00d735ea8a
cluster-name: DEFAULT
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
namespace: 2d108db1-4b7b-4175-8012-be00d735ea8a
group: NACOS_MICROSERVICE_GROUP
dubbo:
scan:
# dubbo 服务扫描基准包
base-packages: com.example.service1server
protocol:
# dubbo 协议
name: dubbo
# dubbo 协议端口
port: 20881
registry:
address: nacos://127.0.0.1:8848
application:
qos-enable: false #dubbo运维服务是否开启
consumer:
check: false #启动时就否检查依赖的服务
服务实现
@org.apache.dubbo.config.annotation.Service
public class ConsumerServiceImpl implements ConsumerService {
@org.apache.dubbo.config.annotation.Reference
private ProviderService providerService;
@Override
public String service() {
return "Consumer invoke " + providerService.service();
}
}
启动类
@SpringBootApplication
@EnableDiscoveryClient
public class Service1ServerApplication {
public static void main(String[] args) {
SpringApplication.run(Service1ServerApplication.class, args);
}
}
service-2父工程
依赖
<packaging>pom</packaging>
<modules>
<module>service-2-api</module>
<module>service-2-server</module>
</modules>
servcie-2-api
依赖
<parent>
<artifactId>service-2</artifactId>
<groupId>com.example</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
服务接口
public interface ProviderService {
String service();
}
service-2-server
依赖
<parent>
<artifactId>service-2</artifactId>
<groupId>com.example</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-dubbo -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>service-2-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
bootstrap.yml
server:
port: 56040
spring:
application:
name: service2
main:
allow-bean-definition-overriding: true
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: 2d108db1-4b7b-4175-8012-be00d735ea8a
cluster-name: DEFAULT
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
namespace: 2d108db1-4b7b-4175-8012-be00d735ea8a
group: NACOS_MICROSERVICE_GROUP
dubbo:
scan:
base-packages: com.example.service2server
protocol:
name: dubbo
port: ${dubbo_port:20882}
registry:
address: nacos://127.0.0.1:8848
application:
qos-enable: false
consumer:
check: false
服务实现
@org.apache.dubbo.config.annotation.Service
public class ProviderServiceImpl implements ProviderService {
@Override
public String service() {
return "provider invoke";
}
}
启动类
@SpringBootApplication
@EnableDiscoveryClient
public class Service2ServerApplication {
public static void main(String[] args) {
SpringApplication.run(Service2ServerApplication.class, args);
}
}
api-gateway 网关
依赖
<parent>
<artifactId>nacos-micro-service</artifactId>
<groupId>com.example</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
<!-- 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.1.3.RELEASE</version>
</dependency>
</dependencies>
bootstrap.yml
server:
port: 56010
spring:
application:
name: api-gateway
main:
allow-bean-definition-overriding: true
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: 2d108db1-4b7b-4175-8012-be00d735ea8a
cluster-name: DEFAULT
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
namespace: 2d108db1-4b7b-4175-8012-be00d735ea8a
group: NACOS_MICROSERVICE_GROUP
还要从nacos读取配置api.gateway.yaml
zuul:
routes:
application1:
stripPrefix: false
path: /application1/**
启动类
@SpringBootApplication
@EnableDiscoveryClient
@EnableZuulProxy
public class ApiGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ApiGatewayApplication.class, args);
}
}
调用逻辑
server1--->server2-->application1--->api-gateway
访问:
- 直接通过appplication1调用:http://localhost:56020/application1/service
- 通过网关调用:http://localhost:56010/application1/service
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
2021-01-25 MQ概述
2021-01-25 缓存穿透,击穿,雪崩
2021-01-25 Redis操作数据命令