• 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

    成功

  • 相关阅读:
    DotNet中的迭代模式和组合模式
    能以可视化方式编辑滤镜效果的Image控件
    自定义ExtenderControl实现服务器控件可拖放
    股票交易费及利润计算器
    用ajax library的客户端脚本实现无刷新分页
    实现html转Xml
    oracle10g主机身份证明错误的解决办法
    创建ASP.NET AJAX客户端组件实现验证控件的toolTip式错误提示
    可分页的Repeater控件
    数据结构趣题——约瑟夫环
  • 原文地址:https://www.cnblogs.com/chenn/p/16252304.html
Copyright © 2020-2023  润新知