Skip to content

如何对接Foundation基础平台实施收敛集成

HaojunRen edited this page Oct 28, 2022 · 1 revision

目录

Nepxion Discovery组件集成和配置开关的提供方式是开放的

  • 插件集成提供组合式的用法,用户可以选择不同的注册中心和配置中心组合,可以选择不同的监控中心,限流熔断等中间件
  • 配置开关需要用户根据不同的企业现状或者根据不同的使用场景,予以定制化打开或者关闭

Nepxion Discovery组件集成和配置开关的使用方式需要收敛

上述工作如果直接丢给业务部门,势必会加重他们的负担,企业的基础架构平台需要承担起这个最佳收敛集成的责任

如下文章,通过举例方式阐述如何进行最佳收敛集成

插件引入的收敛集成

假定企业的基础架构平台名字叫polaris

父Pom收敛集成

基础架构平台封装polaris-parent暴露给业务部门。polaris-parent维护自身的版本并跟随Nepxion Discovery的版本进行迭代

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <groupId>com.nepxion.polaris</groupId>
    <artifactId>polaris-parent</artifactId>
    <name>Nepxion Polaris Parent</name>
    <packaging>pom</packaging>
    <modelVersion>4.0.0</modelVersion>
    <version>1.0.0</version>
    <description>Nepxion Polaris is an enterprise-level SDK</description>
    <url>http://www.nepxion.com</url>

    <properties>
        <discovery.version>6.17.0</discovery.version>

        <!-- Spring Cloud Hoxton compatible versions -->
        <spring.cloud.version>Hoxton.SR12</spring.cloud.version>
        <spring.cloud.alibaba.version>2.2.9.RELEASE</spring.cloud.alibaba.version>
        <spring.boot.version>2.3.12.RELEASE</spring.boot.version>

        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <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>

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>com.nepxion</groupId>
                <artifactId>discovery</artifactId>
                <version>${discovery.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

服务端收敛集成

基础架构平台封装polaris-service暴露给业务部门。polaris-service继承引入polaris-parent

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <artifactId>polaris-service</artifactId>
    <name>Nepxion Polaris Service</name>
    <packaging>jar</packaging>
    <modelVersion>4.0.0</modelVersion>
    <description>Nepxion Polaris is an enterprise-level SDK</description>
    <url>http://www.nepxion.com</url>
    
    <parent>
        <groupId>com.nepxion.polaris</groupId>
        <artifactId>polaris-parent</artifactId>
        <version>1.0.0</version>
    </parent>

    <dependencies>
        <!-- 1.注册中心插件 -->
        <dependency>
            <groupId>com.nepxion</groupId>
            <artifactId>discovery-plugin-register-center-starter-nacos</artifactId>
        </dependency>

        <!-- 2.配置中心插件 -->
        <dependency>
            <groupId>com.nepxion</groupId>
            <artifactId>discovery-plugin-config-center-starter-nacos</artifactId>
        </dependency>

        <!-- 3.管理中心插件 -->
        <dependency>
            <groupId>com.nepxion</groupId>
            <artifactId>discovery-plugin-admin-center-starter</artifactId>
        </dependency>

        <!-- 4.服务策略编排插件 -->
        <dependency>
            <groupId>com.nepxion</groupId>
            <artifactId>discovery-plugin-strategy-starter-service</artifactId>
        </dependency>
    </dependencies>
</project>

网关端收敛集成

基础架构平台封装polaris-gateway暴露给业务部门。polaris-gateway继承引入polaris-parent

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <artifactId>polaris-gateway</artifactId>
    <name>Nepxion Polaris Gateway</name>
    <packaging>jar</packaging>
    <modelVersion>4.0.0</modelVersion>
    <description>Nepxion Polaris is an enterprise-level SDK</description>
    <url>http://www.nepxion.com</url>
    
    <parent>
        <groupId>com.nepxion.polaris</groupId>
        <artifactId>polaris-parent</artifactId>
        <version>1.0.0</version>
    </parent>

    <dependencies>
        <!-- 1.注册中心插件 -->
        <dependency>
            <groupId>com.nepxion</groupId>
            <artifactId>discovery-plugin-register-center-starter-nacos</artifactId>
        </dependency>

        <!-- 2.配置中心插件 -->
        <dependency>
            <groupId>com.nepxion</groupId>
            <artifactId>discovery-plugin-config-center-starter-nacos</artifactId>
        </dependency>

        <!-- 3.管理中心插件 -->
        <dependency>
            <groupId>com.nepxion</groupId>
            <artifactId>discovery-plugin-admin-center-starter</artifactId>
        </dependency>

        <!-- 4.网关策略编排插件 -->
        <dependency>
            <groupId>com.nepxion</groupId>
            <artifactId>discovery-plugin-strategy-starter-gateway</artifactId>
        </dependency>
    </dependencies>
</project>

业务部门引入

业务部门引入可以选择如下两种方式之一

  • 业务部门parentpom先继承引入polaris-parentpom并指定它的版本,再引入polaris-serviceparent-gateway两个pom,不需要指定它们的版本
  • 业务部门直接引入polaris-serviceparent-gateway两个pom,需要分别指定它们的版本
<dependency>
    <groupId>com.nepxion.polaris</groupId>
    <artifactId>polaris-service</artifactId>
    <version>1.0.0</version>
</dependency>

<dependency>
    <groupId>com.nepxion.polaris</groupId>
    <artifactId>polaris-gateway</artifactId>
    <version>1.0.0</version>
</dependency>

配置开关的收敛集成

假定基础架构平台需要对版本故障转移的功能进行封装处理

对于版本故障转移的功能,默认是关闭的,但有些企业希望能开启,有些企业可能不希望。基础架构平台需要结合企业现状,决策这个方案,把开关封装内置进去,形成一种默认行为,不需要业务部门再自行决策和配置

收敛集成有两种方式,基础架构平台可以根据实际情况,使用如下之一

ApplicationContextInitializer收敛集成

在src/main/resources/目录下创建spring-application-default.properties,填入

spring.application.strategy.version.failover.enabled=true

EnvironmentPostProcessor收敛集成

ApplicationContextInitializer收敛集成更灵活,比如,可以灵活控制哪些配置必须以基础架构平台设置为准,业务部门再配置也不会生效;哪些可以被业务部门自行配置覆盖

创建spring.factories

在工程的src/main/resources/META-INF/目录下创建spring.factories

org.springframework.boot.env.EnvironmentPostProcessor=\
com.nepxion.polaris.service.context.PolarisServiceEnvironmentPostProcessor

创建PolarisServiceEnvironmentPostProcessor

PolarisServiceEnvironmentPostProcessor继承EnvironmentPostProcessor,它在不同的Spring Cloud版本下,技术实现细节稍微有所区别,如下

① Spring Cloud 2020版(含)以下

package com.nepxion.polaris.service.context;

import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.Ordered;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.StandardEnvironment;

public class PolarisServiceEnvironmentPostProcessor implements EnvironmentPostProcessor, Ordered {
    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        if (StringUtils.equals(environment.getClass().getName(), StandardEnvironment.class.getName())) {
            String versionFailoverEnabled = "spring.application.strategy.version.failover.enabled";
            if (!environment.containsProperty(versionFailoverEnabled)) {
                System.setProperty(versionFailoverEnabled , "true");
            }
        }
    }

    @Override
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE;
    }
}

② Spring Cloud 2021版(含)以上

package com.nepxion.polaris.service.context;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.Ordered;
import org.springframework.core.env.ConfigurableEnvironment;

public class PolarisServiceEnvironmentPostProcessor implements EnvironmentPostProcessor, Ordered {
    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        if (environment.getClass().getName().contains("BootstrapApplicationListener")) {
            String versionFailoverEnabled = "spring.application.strategy.version.failover.enabled";
            if (!environment.containsProperty(versionFailoverEnabled)) {
                System.setProperty(versionFailoverEnabled , "true");
            }
        }
    }

    @Override
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE;
    }
}

业务部门使用

企业内可能出现99%的业务部门都希望开启这个开关,就直接会启用基础架构平台内置的默认行为,但极少数业务部门希望关闭这个开关。在这样情况下,决策权交给这极少数业务部门,由他们自行配置

启动和关闭版本故障转移。缺失则默认为false
spring.application.strategy.version.failover.enabled=false

商业版解决方案

上述阐述的方式,商业版Nepxion Polaris悲剧更完整更具特色的企业级解决方案,功能也更加强大,稍微举两个小例子

  • 支持在不同的环境下,开关的开启和关闭。例如,在生产环境打开版本故障转移功能,在测试环境关闭版本故障转移功能,由Nepxion Polaris内置,不需要业务部门去额外配置
  • 支持在不同的环境下,连接不同的中间件服务器。例如,在生产环境连接10.10.10.1的Nacos地址,在测试环境连接11.11.11.1的Nacos地址,由Nepxion Polaris内置,不需要业务部门去额外配置

最终呈现在业务部门开发人员面前的几乎是零配置(当然不包括业务部门服务本身的业务配置)

参考如下链接

① 解决方案

② 框架源码

③ 指南示例源码




2017-2050 ©Nepxion Studio Apache License

           

Total visits

讲义篇

集成篇

概念篇

实践篇

功能篇

配置篇

扩展篇

测试篇

升级篇

贡献篇

Clone this wiki locally