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

访问:

posted @   jpy  阅读(91)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源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操作数据命令
点击右上角即可分享
微信分享提示