SOFAStack 技术栈Demo

SOFAStack 技术栈Demo

1、概述

SOFAStack(Scalable Open Financial Architecture Stack)是蚂蚁金服自主研发的金融级云原生架构,包含了构建金融级云原生架构所需的各个组件,是在金融场景里锤炼出来的最佳实践。

官网: https://www.sofastack.tech

码云源码: https://gitee.com/sofastack/

源码: http://github.com/sofastack


项目列表

  • SOFABoot 是基于 Spring Boot 的一套研发框架,完全兼容 Spring Boot 的基础上,还提供了启动期监控检查,上下文隔离,模块化开发,类隔离,日志空间隔离等能力。
  • SOFARPC 是一个高可扩展性、高性能、生产级的 Java RPC 框架。
  • SOFAMesh 是基于 Istio 改进和扩展而来的 Service Mesh 大规模落地实践方案。
  • SOFATracer 是基于 OpenTracing 规范的分布式链路跟踪系统。
  • SOFALookout 是一款解决系统的度量和监控问题的轻量级中间件服务。
  • SOFABolt 是基于 Netty 实现的网络通信框架。
  • SOFAArk 是一款基于 Java 实现的轻量级类隔离容器。
  • SOFAJarslink 是基于 SOFAArk 的动态模块和合并部署的解决方案。
  • SOFAActs 是一款白盒测试框架,旨在为企业提供高效、精细化的接口自动化测试。
  • SOFAJraft 是生产级的 Java 版本的 Raft 协议实现。
  • SOFARegistry 是一款生产级、高时效、高可用的服务注册中心。
  • SOFADashboard 是一站式的 SOFA 框架管控端。
  • Mosn 是 Golang 开发的 Service Mesh 数据平面代理,旨在提供分布式,模块化,可观察,智能化的代理能力。
  • Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。

这里主要对SOFABoot、SOFARegistry、SOFARPC进行使用

测试Demo地址

http://gitlab.zkj.test/enterprise-wechat/dev/sofaboot.git

2、SOFABoot

1、介绍

SOFABoot 是蚂蚁金服开源的基于 SpringBoot 的研发框架,提供了诸如 Readiness Check、类隔离、日志空间隔离等能力,用于快速、敏捷地开发 Spring 应用程序,特别适合构建微服务系统。

SpringBoot 基于 Spring 的按条件配置(Conditional Configuration),结合 starter 依赖机制提供了快捷、方便开发 Spring 项目的体验,获得了极大的成功;SOFABoot 同样在这两个能力上基于 SpringBoot 扩展出适应于金融级应用开发框架。作为脱胎于蚂蚁金服内部对于 SpringBoot 的实践,SOFABoot 补充了 SpringBoot 在大规模金融级生产场景下一些不足的地方,例如 Readiness 检查、类隔离和日志空间隔离等等能力。在增强了 SpringBoot 的同时,SOFABoot 还提供了让用户可以在 SpringBoot 中非常方便地使用 SOFAStack 中间件的能力。

你可以在发布历史中查看所有的发布报告,SOFABoot 版本和 Spring Boot 版本对应关系如下:

SOFABoot 版本 Spring Boot 版本
2.3.x 1.4.2.RELEASE
2.4.x 1.4.2.RELEASE
2.5.x 1.5.16.RELEASE
3.0.x 2.0.3.RELEASE
3.1.x 2.1.0.RELEASE
3.2.x 2.1.0.RELEASE
3.3.0~3.3.1 2.1.11.RELEASE
3.3.2 及以后 2.1.13.RELEASE

现有项目SpringBoot 2.1.0.RELEASE,引入SOFABoot 3.2.1版本

技术栈版本

依赖版本 原因
SpringBoot 2.1.0.RELEASE 现有springcloud项目的版本
SOFABoot 3.2.1 SpringBoot对应版本,与顺德框架统一版本
SOFARegistry 5.2.0
SOFARPC 3.2.1 SOFABoot 3.2.1中托管

2、搭建步骤

1、父工程POM依赖

<!-- 统一管理jar包版本 -->
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
    <registry.client.version>5.2.0</registry.client.version>
    <rpc.version>5.5.2</rpc.version>
</properties>
<!-- 子模块全部继承,子模块不需要写-->
<dependencies>
    <!-- SpringBoot 监控暴露-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <!-- sofa健康检查-->
    <dependency>
        <groupId>com.alipay.sofa</groupId>
        <artifactId>healthcheck-sofa-boot-starter</artifactId>
    </dependency>
</dependencies>
<!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version  -->
<dependencyManagement>
    <dependencies>
        <!--spring-cloud-dependencies引入为pom 文件 -->
        <!-- <scope>import</scope>解决单继承问题,类似parent标签-->
        <!-- sofaboot依赖-->
        <dependency>
            <groupId>com.alipay.sofa</groupId>
            <artifactId>sofaboot-dependencies</artifactId>
            <version>3.1.4</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- SOFARegistry依赖-->
        <dependency>
            <groupId>com.alipay.sofa</groupId>
            <artifactId>registry-client-all</artifactId>
            <version>${registry.client.version}</version>
        </dependency>
         <!--SOFARPC 依赖Sofaboot中托管-->

    </dependencies>
</dependencyManagement>
     <!--SOFARPC 依赖Sofaboot中托管  在Sofaboot3.1.4中需要单独加Sofaboot的依赖 3.2.1不需要-->
<dependency>
                <groupId>com.alipay.sofa</groupId>
                <artifactId>rpc-sofa-boot-starter</artifactId>
                <version>${rpc.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.jboss.resteasy</groupId>
                        <artifactId>jaxrs-api</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>

2、SOFABootDemo的POM依赖

<!-- SpringBootWeb依赖-->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
<!-- SpringBoot 监控暴露-->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-actuator</artifactId>
 </dependency>
 <!-- sofa健康检查-->
 <dependency>
     <groupId>com.alipay.sofa</groupId>
     <artifactId>healthcheck-sofa-boot-starter</artifactId>
 </dependency>

3、yml配置

#必须要有name,否则报错
spring:
  application:
    name: SOFABoot Demo
#端口号
server:
  port: 9090
#日志
logging:
  path: ./logs
  level:
    com:
      alipay:
        test: INFO
# 暴露监控端点
management:
  endpoints:
    web:
      exposure:
        include: "*"

4、写测试controller

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String Hello()
    {
      return "ok";
    }
}

5、测试

浏览器访问地址:http://localhost:9090/hello,返回ok

可以通过在浏览器中输入 http://localhost:9090/actuator/readiness 查看应用 Readiness Check 的状况

{
    "status":"UP",
    "details":{
        "SOFABootReadinessHealthCheckInfo":{
            "status":"UP"
        },
        "diskSpace":{
            "status":"UP",
            "details":{
                "total":296626417664,
                "free":293247467520,
                "threshold":10485760
            }
        }
    }
}

3、SOFARegistry

1、介绍

SOFARegistry 是蚂蚁金服开源的一个生产级、高时效、高可用的服务注册中心。SOFARegistry 最早源自于淘宝的 ConfigServer,十年来,随着蚂蚁金服的业务发展,注册中心架构已经演进至第五代。目前 SOFARegistry 不仅全面服务于蚂蚁金服的自有业务,还随着蚂蚁金融科技服务众多合作伙伴,同时也兼容开源生态。SOFARegistry 采用 AP 架构,支持秒级时效性推送,同时采用分层架构支持无限水平扩展。

2、搭建

1. 下载源码或者安装包

git clone https://github.com/sofastack/sofa-registry.git
cd sofa-registry
mvn clean package -DskipTests
cp server/distribution/integration/target/registry-integration.tgz <somewhere>
cd <somewhere> && mkdir registry-integration 
tar -zxvf registry-integration.tgz -C registry-integration
cd registry-integration

下载安装包方式

您可以从 release 页面 下载最新的 registry-integration-$version.tar.gz 包。

mkdir registry-integration 
tar -zxvf registry-integration-$version.tar.gz -C registry-integration
cd registry-integration

2. 启动 registry-integration

Linux/Unix/Mac

启动命令:sh bin/startup.sh

Windows

双击 bin 目录下的 startup.bat 运行文件。

3.确认运行状态

可访问三个角色提供的健康监测 API,或查看日志 logs/registry-startup.log:

# 查看meta角色的健康检测接口:
$ curl http://localhost:9615/health/check
{"success":true,"message":"... raftStatus:Leader"}

# 查看data角色的健康检测接口:
$ curl http://localhost:9622/health/check
{"success":true,"message":"... status:WORKING"}

# 查看session角色的健康检测接口:
$ curl http://localhost:9603/health/check
{"success":true,"message":"..."}

4、SOFARPC

1、介绍

SOFARPC 是蚂蚁金服开源的一款基于 Java 实现的 RPC 服务框架,为应用之间提供远程服务调用能力,具有高可伸缩性,高容错性,目前蚂蚁金服所有的业务的相互间的 RPC 调用都是采用 SOFARPC。SOFARPC 为用户提供了负载均衡,流量转发,链路追踪,链路数据透传,故障剔除等功能。

SOFARPC 还支持不同的协议,目前包括 boltRESTfuldubboH2C 协议进行通信。其中 bolt 是蚂蚁金融服务集团开放的基于 Netty 开发的网络通信框架。

image.png | left | 748x404

  1. 当一个 SOFARPC 的应用启动的时候,如果发现当前应用需要发布 RPC 服务的话,那么 SOFARPC 会将这些服务注册到服务注册中心上。如图中 Service 指向 Registry。
  2. 当引用这个服务的 SOFARPC 应用启动时,会从服务注册中心订阅到相应服务的元数据信息。服务注册中心收到订阅请求后,会将发布方的元数据列表实时推送给服务引用方。如图中 Registry 指向 Reference。
  3. 当服务引用方拿到地址以后,就可以从中选取地址发起调用了。如图中 Reference 指向 Service。

2、服务端搭建

1、POM依赖

<!-- SpringBootWeb依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--SOFARPC 依赖-->
<dependency>
    <groupId>com.alipay.sofa</groupId>
    <artifactId>rpc-sofa-boot-starter</artifactId>
</dependency>
<!--SOFARegistry 依赖-->
<dependency>
    <groupId>com.alipay.sofa</groupId>
    <artifactId>registry-client-all</artifactId>
</dependency>

2、yml

#应用名称
spring:
  application:
    name: sofa-server
#端口号
server:
  port: 8081

#日志位置
logging:
  path: ./logs
#暴露监控
management:
  endpoints:
    web:
      exposure:
        include: "*"
#注册中心地址
com:
  alipay:
    sofa:
      rpc:
        registry:
          address: sofa://10.99.67.16:9603

3、Config

/*
阿里更新bug https://github.com/sofastack/sofa-boot/issues/566
升级sofa-boot到3.2.1版本后,SOFARegistry无法使用,只能使用zk做注册中心。
检查代码发现是SofaRpcAutoConfiguration这个类在做注入注册中心处理器实现时添加了 @ConditionalOnMissingBean 注解,
导致只注入了local、mesh和zk的处理器,其它注册中心的处理器没有注入。
不知为何要做这个配置?
添加此配置添加SofaRegistry的使用
 */
@Component
public class SofaRegistry {

    @Bean
    @ConditionalOnMissingBean
    public SofaRegistryConfigurator sofaRegistryConfigurator() {
        return new SofaRegistryConfigurator();
    }
}

4、测试代码

package com.feng.service;

public interface HelloSyncService {
    String saySync(String string);
}

实现

//发布成一个 SOFARPC 服务: HelloSyncService接口,bolt协议
@SofaService(interfaceType = HelloSyncService.class, bindings = { @SofaServiceBinding(bindingType = "bolt")})
@Component
public class HelloSyncServiceImpl implements HelloSyncService {
    @Override
    public String saySync(String string) {
        System.out.println("1111111111111111111111111111111111");
        return string;
    }
}

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String Hello()
    {
       return "ok";
    }
}

3、客户端调用

1、POM依赖

<!-- SpringBootWeb依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--SOFARPC 依赖-->
<dependency>
    <groupId>com.alipay.sofa</groupId>
    <artifactId>rpc-sofa-boot-starter</artifactId>
</dependency>
<!--SOFARegistry 依赖-->
<dependency>
    <groupId>com.alipay.sofa</groupId>
    <artifactId>registry-client-all</artifactId>
</dependency>

2、yml

#应用名称
spring:
  application:
    name: sofa-client
#端口号
server:
  port: 8082

#日志位置
logging:
  path: ./logs
#暴露监控
management:
  endpoints:
    web:
      exposure:
        include: "*"
#注册中心地址
com:
  alipay:
    sofa:
      rpc:
        registry:
          address: sofa://10.99.67.16:9603

3、Config

/*
阿里更新bug https://github.com/sofastack/sofa-boot/issues/566
升级sofa-boot到3.2.1版本后,SOFARegistry无法使用,只能使用zk做注册中心。
检查代码发现是SofaRpcAutoConfiguration这个类在做注入注册中心处理器实现时添加了 @ConditionalOnMissingBean 注解,
导致只注入了local、mesh和zk的处理器,其它注册中心的处理器没有注入。
不知为何要做这个配置?
添加此配置添加SofaRegistry的使用
 */
@Component
public class SofaRegistry {

    @Bean
    @ConditionalOnMissingBean
    public SofaRegistryConfigurator sofaRegistryConfigurator() {
        return new SofaRegistryConfigurator();
    }
}

3、测试代码

  • HelloSyncService必须和server里面的包名相同
package com.feng.service;

public interface HelloSyncService {
    String saySync(String string);
}

HelloSyncClientService类

@Component
public class HelloSyncClientService {
    //引用 SOFARPC 服务,bolt协议
    @SofaReference(interfaceType = HelloSyncService.class, binding = @SofaReferenceBinding(bindingType = "bolt"))
    private HelloSyncService helloSyncService;

    public String saySync(String str) {
        return helloSyncService.saySync(str);
    }
}

HelloController

@RestController
public class HelloController {
    @Autowired
    private HelloSyncClientService helloSyncClientService;

    @GetMapping(value = "/hello")
    public String saySync(@RequestParam("str") String str) {
        return helloSyncClientService.saySync(str);
    }

    @GetMapping(value = "/hello1")
    public String saySync1() {
        return helloSyncClientService.saySync("11111");
    }

    @GetMapping(value = "/hello12")
    public String saySync() {
        return "11111";
    }
}

4、测试

浏览器访问http://localhost:8082/hello?str=111 ,返回111

成功

posted @ 2022-05-10 09:55  风雨无阻415  阅读(476)  评论(0编辑  收藏  举报