Polaris【北极星】企业级云原生微服务框架

Stella981
• 阅读 1103

Polaris【北极星】企业级云原生微服务框架 Polaris【北极星】企业级云原生微服务框架

① Polaris【北极星】企业级云原生微服务框架文档

  • Polaris【北极星】企业级云原生微服务框架(PDF版)

  • Polaris【北极星】企业级云原生微服务框架(HTML版)

② Polaris【北极星】企业级云原生微服务框架源码。请访问Gitee镜像获得最佳体验

  • 源码Gitee同步镜像

  • 源码Github原镜像

③ Polaris【北极星】企业级云原生微服务框架指南示例源码。请访问Gitee镜像获得最佳体验

  • 指南Gitee同步镜像

  • 指南Github原镜像

Polaris【北极星】企业级云原生微服务框架 Discovery【探索】微服务企业级解决方案

① Discovery【探索】微服务企业级解决方案文档

  • Discovery【探索】微服务企业级解决方案(PPT版)

  • Discovery【探索】微服务企业级解决方案(PDF版)

  • Discovery【探索】微服务企业级解决方案(HTML版)

② Discovery【探索】微服务企业级解决方案源码。请访问Gitee镜像获得最佳体验

  • 源码Gitee同步镜像

  • 源码Github原镜像

③ Discovery【探索】微服务企业级解决方案指南示例源码。请访问Gitee镜像获得最佳体验

  • 指南Gitee同步镜像

  • 指南Github原镜像

④ Discovery【探索】微服务框架指南示例说明

  • 对于入门级玩家,参考指南示例极简版,分支为simple。涉及到指南篇里的灰度路由和发布的基本功能, Polaris【北极星】企业级云原生微服务框架 参考新手快速入门

  • 对于熟练级玩家,参考指南示例精进版,分支为master。除上述《极简版》功能外,涉及到指南篇里的绝大多数高级功能

  • 对于骨灰级玩家,参考指南示例高级版,分支为premium。除上述《精进版》功能外,涉及到指南篇里的ActiveMQ、MongoDB、RabbitMQ、Redis、RocketMQ、MySQL等高级调用链和灰度调用链的整合

Polaris【北极星】企业级云原生微服务框架 Discovery【探索】和Polaris【北极星】联合架构图

Polaris【北极星】企业级云原生微服务框架

Polaris【北极星】企业级云原生微服务框架 Discovery【探索】和Polaris【北极星】联合拓扑图

Polaris【北极星】企业级云原生微服务框架

Polaris【北极星】企业级云原生微服务框架 Polaris【北极星】分层架构图

Polaris【北极星】企业级云原生微服务框架

Polaris【北极星】企业级云原生微服务框架 Discovery【探索】实施方案图

Polaris【北极星】企业级云原生微服务框架

Polaris【北极星】企业级云原生微服务框架 Discovery【探索】域网关实施图

Polaris【北极星】企业级云原生微服务框架

Polaris【北极星】企业级云原生微服务框架 Discovery【探索】非域网关实施图

Polaris【北极星】企业级云原生微服务框架

Polaris【北极星】企业级云原生微服务框架 Discovery【探索】全局订阅实施图

Polaris【北极星】企业级云原生微服务框架

前言

① 云原生(Cloud Native)定义

英文版定义

Cloud native technologies empower organizations to build and run scalable applications in modern, dynamic environments such as public, private, and hybrid clouds. Containers, service meshes, microservices, immutable infrastructure, and declarative APIs exemplify this approach.

These techniques enable loosely coupled systems that are resilient, manageable, and observable. Combined with robust automation, they allow engineers to make high-impact changes frequently and predictably with minimal toil.

The Cloud Native Computing Foundation seeks to drive adoption of this paradigm by fostering and sustaining an ecosystem of open source, vendor-neutral projects. We democratize state-of-the-art patterns to make these innovations accessible for everyone.

中文版定义

云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API。

这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。结合可靠的自动化手段,云原生技术使工程师能够轻松地对系统作出频繁和可预测的重大变更。

云原生计算基金会(CNCF)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。我们通过将最前沿的模式民主化,让这些创新为大众所用。

-- 摘自Github CNCF官网CNCF Cloud Native Definition v1.0

② 云原生(Cloud Native)要素

Polaris【北极星】企业级云原生微服务框架 Pivotal官网对云原生概括为4个要素,如下

要素

描述

Micro Service

微服务

Container

容器

DevOps

开发运维一体化,包含CI(Continuous Integration)持续集成

CD

持续交付(Continuous Delivery)

③ 云原生(Cloud Native)所需能力与特征

Polaris【北极星】企业级云原生微服务框架

Polaris【北极星】企业级云原生微服务框架 下文着重刻画Micro Service的架构,阐述DevOps的边界,展现Container的落地,但不涉及CD的层面

简介

Polaris【北极星】企业级云原生微服务基础架构脚手架,围绕Discovery【探索】框架打造,基于Spring Cloud Discovery服务注册发现、Ribbon负载均衡、Feign和RestTemplate调用等组件全方位增强的企业级云原生微服务开源解决方案,面向企业级生产需求精雕细琢,赋能和助力企业快速搭建基础架构的底层云原生微服务框架。整个架构体系打造,遵循最严格的Maven对称结构和规范,最严格的命名格式,给予使用者最舒适的使用体验

支持如下中间件的集成和封装

  • 支持阿里巴巴Nacos、Eureka、Consul和Zookeeper四个服务注册发现中心

  • 支持阿里巴巴Nacos、携程Apollo两个远程配置中心

  • 支持阿里巴巴Sentinel和Hystrix两个熔断限流降级权限中间件

  • 支持Uber Jaeger、Apache Skywalking两个符合OpenTracing规范的调用链中间件

  • 支持Prometheus Micrometer和Spring Boot Admin两个指标中间件

  • 支持Java Agent解决异步跨线程ThreadLocal上下文传递

  • 支持Spring Cloud Gateway、Zuul网关、微服务、控制台、自动化测试五个独立的应用层

  • 支持和兼容Spring Cloud Finchley版、Greenwich版和Hoxton版。默认集成Hoxton版,如果需要,请使用者自行修改成其它两个版本

支持如下应用型的功能

  • 支持灰度蓝绿发布、灰度路由过滤、流量权重、限流、熔断、降级、隔离、监控、追踪等企业生产级功能

  • 支持动态域名、双云双活和SET单元化的配置,支持跨云的服务注册和配置读取(例如,阿里云上的微服务想要注册到华为云上的Nacos注册中心,或者跨云读取Apollo配置中心的配置,通过DevOps修改相关配置驱动即可)。一套SDK体系可以同时适配和运行在不同的云上

  • 支持在核心的pom.xml上实现同类型的组件的快速切换(例如,Eureka注册中心切换到Consul,Apollo配置中心切换到Nacos等),但同类型组件不可并存使用(例如,Eureka和Consul注册中心不可同时并存,Apollo和Nacos配置中心不可同时并存等)

  • 支持框架层面实现每个组件对四个环境(DEV | FAT | UAT | PRO)的内置最佳配置,遵循全局公共配置和局部环境配置相结合的方式,遵循“约定大于配置”的策略,业务层面实现微量配置甚至零配置。框架集成人员可以内置定制化的配置,业务开发人员在业务层可以把内置的配置覆盖掉,达到扩展性强、灵活使用的目的

  • 支持业务开发人员使用该框架的时候,对其尽最大可能屏蔽一切跟Spring Cloud和中间件有关的代码书写、配置参数、环境地址等,零Spring Cloud经验的业务开发人员也可以快速上手研发基于Spring Cloud微服务技术栈的业务服务,最大程度上减轻业务人员的压力

请联系我

微信、公众号和文档

Polaris【北极星】企业级云原生微服务框架
Polaris【北极星】企业级云原生微服务框架
Polaris【北极星】企业级云原生微服务框架

相关链接

源码主页

Polaris源码主页

Discovery源码主页

指南主页

Polaris指南主页

Discovery指南主页

文档主页

文档主页

工程架构

工程清单

工程集成了众多的中间件,清单如下

① 简略清单

  • 核心组件

核心组件名

组件类型

Polaris【北极星】企业级云原生微服务框架 旗标组件

Nepxion Discovery

Polaris【北极星】企业级云原生微服务框架 注册发现组件

Nacos & Eureka & Consul & Zookeeper

Polaris【北极星】企业级云原生微服务框架 配置组件

Apollo & Nacos

Polaris【北极星】企业级云原生微服务框架 调用链组件

Skywalking + OpenTracing & Jaeger + OpenTracing

Polaris【北极星】企业级云原生微服务框架 指标组件

Prometheus Micrometer & Spring Boot Admin

Polaris【北极星】企业级云原生微服务框架 防护组件

Sentinel & Hystrix

Polaris【北极星】企业级云原生微服务框架 灰度蓝绿组件

Nepxion Discovery

Polaris【北极星】企业级云原生微服务框架 Agent组件

Nepxion Discovery

Polaris【北极星】企业级云原生微服务框架 环境组件

Nepxion Polaris内置

Polaris【北极星】企业级云原生微服务框架 控制台组件

Nepxion Discovery

Polaris【北极星】企业级云原生微服务框架 自动化测试组件

Nepxion Discovery

  • 框架分层

框架分层名

分层类型

Polaris【北极星】企业级云原生微服务框架 Gateway网关层

Spring Cloud Gateway + Nepxion Discovery

Polaris【北极星】企业级云原生微服务框架 Zuul网关层

Spring Cloud Netfilx Zuul + Nepxion Discovery

Polaris【北极星】企业级云原生微服务框架 微服务层

Spring Cloud Service + Nepxion Discovery

Polaris【北极星】企业级云原生微服务框架 控制台层

Spring Cloud Service + Nepxion Discovery

Polaris【北极星】企业级云原生微服务框架 测试层

Spring Boot + Nepxion Discovery

② 详细清单

工程名

描述

Polaris【北极星】企业级云原生微服务框架 polaris-parent

Polaris Parent定义

Polaris【北极星】企业级云原生微服务框架 polaris-platform

Polaris平台目录

  Polaris【北极星】企业级云原生微服务框架 polaris-component

Polaris组件目录

    Polaris【北极星】企业级云原生微服务框架 polaris-component-common

Polaris通用组件

    Polaris【北极星】企业级云原生微服务框架 polaris-component-env

Polaris环境组件,支持动态域名、双云双活和SET单元化
支持DEV、FAT、UAT、PRO四个环境配置动态读取

    Polaris【北极星】企业级云原生微服务框架 polaris-component-banner

Polaris旗标组件目录

      Polaris【北极星】企业级云原生微服务框架 polaris-component-banner-starter

Polaris旗标组件,启动时显示旗标和重要中间件版本号信息

    Polaris【北极星】企业级云原生微服务框架 polaris-component-discovery

Polaris 注册发现组件目录

      Polaris【北极星】企业级云原生微服务框架 polaris-component-discovery-starter-nacos

Polaris Nacos注册发现组件的封装

      Polaris【北极星】企业级云原生微服务框架 polaris-component-discovery-starter-consul

Polaris Consul注册发现组件的封装

      Polaris【北极星】企业级云原生微服务框架 polaris-component-discovery-starter-eureka

Polaris Eureka注册发现组件的封装

      Polaris【北极星】企业级云原生微服务框架 polaris-component-discovery-starter-zookeeper

Polaris Zookeeper注册发现组件的封装

      Polaris【北极星】企业级云原生微服务框架 polaris-component-discovery-starter

Polaris注册发现组件的聚合和组装

    Polaris【北极星】企业级云原生微服务框架 polaris-component-config

Polaris 配置组件目录

      Polaris【北极星】企业级云原生微服务框架 polaris-component-config-starter-apollo

Polaris Apollo配置组件的封装

      Polaris【北极星】企业级云原生微服务框架 polaris-component-config-starter-apollo-console

Polaris控制台集成Apollo配置组件的封装

      Polaris【北极星】企业级云原生微服务框架 polaris-component-config-starter-apollo-sentinel

Polaris Sentinel集成Apollo配置组件的封装

      Polaris【北极星】企业级云原生微服务框架 polaris-component-config-starter-nacos

Polaris Nacos配置组件的封装

      Polaris【北极星】企业级云原生微服务框架 polaris-component-config-starter-nacos-console

Polaris控制台集成Nacos配置组件的封装

      Polaris【北极星】企业级云原生微服务框架 polaris-component-config-starter-nacos-sentinel

Polaris Sentinel集成Nacos配置组件的封装

      Polaris【北极星】企业级云原生微服务框架 polaris-component-config-starter

Polaris配置组件的聚合和组装

    Polaris【北极星】企业级云原生微服务框架 polaris-component-tracing

Polaris调用链组件目录

      Polaris【北极星】企业级云原生微服务框架 polaris-component-tracing-starter-jaeger

Polaris Jaeger调用链组件的封装

      Polaris【北极星】企业级云原生微服务框架 polaris-component-tracing-starter-jaeger-sentinel

Polaris Jaeger调用链组件集成Sentinel的封装

      Polaris【北极星】企业级云原生微服务框架 polaris-component-tracing-starter-skywalking

Polaris Skywalking调用链组件的封装

      Polaris【北极星】企业级云原生微服务框架 polaris-component-tracing-starter-skywalking-sentinel

Polaris Skywalking调用链组件集成Sentinel的封装

      Polaris【北极星】企业级云原生微服务框架 polaris-component-tracing-starter

Polaris调用链组件的聚合和组装

    Polaris【北极星】企业级云原生微服务框架 polaris-component-metrics

Polaris指标组件目录

      Polaris【北极星】企业级云原生微服务框架 polaris-component-metrics-starter-micrometer

Polaris Micrometer指标组件的封装

      Polaris【北极星】企业级云原生微服务框架 polaris-component-metrics-starter-spring-boot-admin

Polaris Spring Boot Admin指标组件的封装

      Polaris【北极星】企业级云原生微服务框架 polaris-component-metrics-starter

Polaris指标组件的聚合和组装

    Polaris【北极星】企业级云原生微服务框架 polaris-component-protector

Polaris防护组件目录

      Polaris【北极星】企业级云原生微服务框架 polaris-component-protector-starter-sentinel-common

Polaris Sentinel防护组件通用模块

      Polaris【北极星】企业级云原生微服务框架 polaris-component-protector-starter-sentinel-gateway

Polaris Sentinel防护组件集成Spring Cloud Gateway网关的封装

      Polaris【北极星】企业级云原生微服务框架 polaris-component-protector-starter-sentinel-zuul

Polaris Sentinel防护组件集成Zuul网关的封装

      Polaris【北极星】企业级云原生微服务框架 polaris-component-protector-starter-sentinel-service

Polaris Sentinel防护组件集成微服务的封装

      Polaris【北极星】企业级云原生微服务框架 polaris-component-protector-starter-hystrix

Polaris支持Hystrix防护组件跨线程异步调用

      Polaris【北极星】企业级云原生微服务框架 polaris-component-protector-starter-gateway

Polaris防护组件集成Spring Cloud Gateway网关的聚合和组装

      Polaris【北极星】企业级云原生微服务框架 polaris-component-protector-starter-zuul

Polaris防护组件集成Zuul网关的聚合和组装

      Polaris【北极星】企业级云原生微服务框架 polaris-component-protector-starter-service

Polaris防护组件集成微服务的聚合和组装

    Polaris【北极星】企业级云原生微服务框架 polaris-component-gray

Polaris灰度蓝绿组件目录

      Polaris【北极星】企业级云原生微服务框架 polaris-component-gray-starter-common

Polaris灰度蓝绿组件通用模块

      Polaris【北极星】企业级云原生微服务框架 polaris-component-gray-starter-gateway

Polaris灰度蓝绿组件集成Spring Cloud Gateway网关的封装

      Polaris【北极星】企业级云原生微服务框架 polaris-component-gray-starter-zuul

Polaris灰度蓝绿组件集成Zuul网关的封装

      Polaris【北极星】企业级云原生微服务框架 polaris-component-gray-starter-service

Polaris灰度蓝绿组件集成微服务的封装

    Polaris【北极星】企业级云原生微服务框架 polaris-component-agent

Polaris Agent组件目录

      Polaris【北极星】企业级云原生微服务框架 polaris-component-agent-starter-cross-thread

Polaris支持跨线程异步调用Agent组件

    Polaris【北极星】企业级云原生微服务框架 polaris-component-console

Polaris控制台组件目录

      Polaris【北极星】企业级云原生微服务框架 polaris-component-console-starter

Polaris控制台组件的封装

    Polaris【北极星】企业级云原生微服务框架 polaris-component-test

Polaris测试组件目录

      Polaris【北极星】企业级云原生微服务框架 polaris-component-test-starter-automation

Polaris自动化测试组件

      Polaris【北极星】企业级云原生微服务框架 polaris-component-test-starter

Polaris测试组件的聚合和组装

  Polaris【北极星】企业级云原生微服务框架 polaris-framework

Polaris框架目录

    Polaris【北极星】企业级云原生微服务框架 polaris-framework-starter-api

Polaris框架对微服务API二方包的封装,主要是对Feign的封装

    Polaris【北极星】企业级云原生微服务框架 polaris-framework-starter-service

Polaris框架对微服务的封装

    Polaris【北极星】企业级云原生微服务框架 polaris-framework-starter-gateway

Polaris框架对Spring Cloud Gateway网关的封装

    Polaris【北极星】企业级云原生微服务框架 polaris-framework-starter-zuul

Polaris框架对Zuul网关的封装

    Polaris【北极星】企业级云原生微服务框架 polaris-framework-starter-console

Polaris框架对控制台的封装

    Polaris【北极星】企业级云原生微服务框架 polaris-framework-starter-test

Polaris框架对测试的封装

架构核心

架构核心位于polaris-framework下,包含如下6个顶级框架层

  • polaris-framework-starter-api

  • polaris-framework-starter-service

  • polaris-framework-starter-gateway

  • polaris-framework-starter-zuul

  • polaris-framework-starter-console

  • polaris-framework-starter-test

以polaris-framework-starter-service为例,展现出高度对称统一的架构美感

`

    polaris-framework-starter-service
    Nepxion Polaris Framework Starter Service
    jar
    4.0.0

    
        com.nepxion.polaris
        polaris-framework
        1.0.0
    

    
        
        
            ${project.groupId}
            polaris-component-banner-starter
            ${project.version}
        

        
        
            ${project.groupId}
            polaris-component-discovery-starter
            ${project.version}
        

        
        
            ${project.groupId}
            polaris-component-config-starter
            ${project.version}
        

        
        
            ${project.groupId}
            polaris-component-tracing-starter
            ${project.version}
        

        
        
            ${project.groupId}
            polaris-component-metrics-starter
            ${project.version}
        

        
        
            ${project.groupId}
            polaris-component-protector-starter-service
            ${project.version}
        

        
        
            ${project.groupId}
            polaris-component-gray-starter-service
            ${project.version}
        

    

`

集成步骤

Parent切换

  • 框架提供Polaris Parent,定义了Spring Cloud、Spring Cloud Alibaba和Spring Boot版本号,同时在Polaris SDK上也进行了这些版本的相同定义,目的是让业务开发人员可以接入Polaris的时候可以选择Polaris Parent,也可以选择业务自己的Parent,只接入Polaris SDK

  • 当接入Polaris Parent的时候,版本号以Polaris Parent定义为优先,否则以Polaris SDK定义为准

组织命名切换

使用者可以把Polaris改造成自己企业名义上的框架。假设,企业名称为alibaba

① 全局替换Pom GroupId和src/main/resources/META-INF/spring.factories。在根目录下,搜索全部文件,关键字

com.nepxion.polaris

替换成

com.alibaba.polaris

② 手工替换src/main/java/下的Java包目录名

com.nepxion.polaris

替换成

com.alibaba.polaris

版本切换

  • Polaris Parent定义

Polaris【北极星】企业级云原生微服务框架 使用者可以自行对Polaris Parent层和Polaris SDK层中三个中间件的版本号进行升级或者降级,也可以自定义更多的第三方中间件版本

`

    com.nepxion.polaris
    polaris-parent
    Nepxion Polaris Parent
    pom
    4.0.0
    1.0.0
    Nepxion Polaris is an enterprise-level platform
    http://www.nepxion.com

    
        <polaris.version>1.0.0</polaris.version>
        <discovery.version>6.3.1</discovery.version>

        
        <spring.cloud.version>Hoxton.SR8</spring.cloud.version>
        <spring.cloud.alibaba.version>2.2.3.RELEASE</spring.cloud.alibaba.version>
        <spring.boot.version>2.3.4.RELEASE</spring.boot.version>
        <spring.boot.admin.version>2.3.0</spring.boot.admin.version>

        
        

        
        

        
        
        <opentracing.spring.cloud.version>0.5.5</opentracing.spring.cloud.version>
        <opentracing.spring.jaeger.version>3.1.2</opentracing.spring.jaeger.version>
        <opentracing.concurrent.version>0.4.0</opentracing.concurrent.version>

        

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

    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                ${spring.cloud.version}
                pom
                import
            

            
                com.alibaba.cloud
                spring-cloud-alibaba-dependencies
                ${spring.cloud.alibaba.version}
                pom
                import
            

            
                org.springframework.boot
                spring-boot-dependencies
                ${spring.boot.version}
                pom
                import
            

            
                de.codecentric
                spring-boot-admin-dependencies
                ${spring.boot.admin.version}
                pom
                import
            

            
                com.nepxion
                discovery
                ${discovery.version}
                pom
                import
            

        
    

`

Polaris【北极星】企业级云原生微服务框架 注意:OpenTracing在Polaris Parent的版本定义如果低版本Spring Cloud运行时存在问题,请自行把OpenTracing也切换到低版本。目前测试下来都是兼容的

Polaris【北极星】企业级云原生微服务框架 注意:OpenTracing对Finchley版的Spring Cloud Gateway的reactor-core包存在版本兼容性问题,如果使用者希望Finchley版的Spring Cloud Gateway上使用OpenTracing,需要做如下改造

`
    com.nepxion
    discovery-plugin-strategy-starter-gateway
    ${discovery.version}
    
        
            io.projectreactor
            reactor-core
        

    

    io.projectreactor     reactor-core     3.2.3.RELEASE `

上述方式也适用于其它引入了低版本reactor-core包版本兼容性的场景

Polaris【北极星】企业级云原生微服务框架 注意:“策略下内置Header来决策蓝绿和灰度,可以代替外部传入Header”,这块功能Spring Cloud Gateway在Finchley版不支持

组件切换

Polaris【北极星】企业级云原生微服务框架 框架默认生效的组件,如下

核心组件名

默认生效的组件

Polaris【北极星】企业级云原生微服务框架 旗标核心组件

Nepxion Discovery

Polaris【北极星】企业级云原生微服务框架 注册发现核心组件

Nacos

Polaris【北极星】企业级云原生微服务框架 配置核心组件

Nacos

Polaris【北极星】企业级云原生微服务框架 调用链核心组件

Skywalking

Polaris【北极星】企业级云原生微服务框架 指标核心组件

未激活

Polaris【北极星】企业级云原生微服务框架 防护核心组件

Sentinel

Polaris【北极星】企业级云原生微服务框架 灰度蓝绿核心组件

Nepxion Discovery

注册发现组件切换

在polaris-component目录下,搜索全部pom.xml,关键字

You can select one of following polaris discovery components, such as Nacos

把搜索出来的若干个pom.xml换成使用者想要的组件

配置组件切换

在polaris-component目录下,搜索全部pom.xml,关键字

You can select one of following polaris config components, such as Apollo

把搜索出来的若干个pom.xml换成使用者想要的组件

调用链组件切换

在polaris-component目录下,搜索全部pom.xml,关键字

You can select one of following polaris tracing components, such as Skywalking

把搜索出来的若干个pom.xml换成使用者想要的组件

指标组件切换

在polaris-component目录下,搜索全部pom.xml,关键字

You can select one of following polaris metrics components, such as Micrometer

把搜索出来的若干个pom.xml换成使用者想要的组件

防护组件切换

在polaris-component目录下,搜索全部pom.xml,关键字

You can select one of following polaris protector components, such as Sentinel

把搜索出来的若干个pom.xml换成使用者想要的组件

注解切换

当配置组件切换到Apollo的时候,需要激活Apollo注解@EnableApolloConfig;非Apollo配置组件需要注释掉该注解,否则无法编译通过。需要在如下四个注解进行切换

  • @EnablePolarisGateway

  • @EnablePolarisZuul

  • @EnablePolarisService

  • @EnablePolarisConsole

配置切换

当防护中心选择Sentinel,并选择Apollo和Nacos做DataSource的时候,例如,当选择Apollo的时候,需要注释掉其它所有的Nacos配置。需要在如下三个组件的sentinel-common.properties配置文件里进行切换配

  • polaris-component-protector-starter-sentinel-gateway

  • polaris-component-protector-starter-sentinel-zuul

  • polaris-component-protector-starter-sentinel-service

域名和环境切换

域名和环境解析

所有的组件都支持四个环境(DEV | FAT | UAT | PRO),分别对应开发环境、测试环境、准生产环境、生产环境。框架支持在环境配置文件里动态解析和创建多活、多云和SET单元化模式的域名

Polaris【北极星】企业级云原生微服务框架 框架组件环境配置规范(表格中以Nacos注册为示例),如下

环境

域名或者IP地址

配置文件

示例

DEV

默认为127.0.0.1:port

组件名-dev
.properties

spring.cloud.nacos.discovery.server-addr=
127.0.0.1:8848

FAT

组件名-fat-可选的区域名.根域

组件名-fat
.properties

spring.cloud.nacos.discovery.server-addr=
nacos-fat${region}.${domain}

UAT

组件名-uat-可选的区域名.根域

组件名-uat
.properties

spring.cloud.nacos.discovery.server-addr=
nacos-uat${region}.${domain}

PRO

组件名-pro-可选的区域名.根域

组件名-pro
.properties

spring.cloud.nacos.discovery.server-addr=
nacos-pro${region}.${domain}

COMMON

无需配置

组件名-common
.properties

无需配置

① 环境(env)号

  • 定义为用来区别不同环境的标识

  • 四个环境的配置文件除了定义域名或者IP地址外,也支持根据环境不同设置不同的配置值或者开关(例如,Swagger功能需要在生产环境关闭,需要在PRO配置文件里关闭)

  • 除了四个环境的配置文件外,还存在一个公共配置文件,其作用是设置全局的不会随环境改变的默认配置,共享给四个环境,避免重复冗余配置。公共配置和环境配置,其关系是全局配置和局部配置的关系,如果同一个配置在公共配置文件和环境配置文件里都存在,环境配置文件优先

  • 所有配置文件的位置在各个组件的src/main/resources/META-INF目录下,其中COMMON配置文件可以缺失,其它四个环境的配置文件不可缺失

② 区域(region)名

  • 定义为用来区别多活、多云和SET单元化的域名的后缀或者前缀标识

  • 域名表达式为 组件名- 环境号- 可选的区域名. 根域。使用者可以改变前缀或者后缀的组装形式和顺序,前缀中的“-”可以用其它符号来代替

  • 实现占位处理,占位格式为 ${region}。如果区域(region)名不设置,那么变成“组件名-环境号.根域”的简单格式

  • 通过DevOps来实现环境号和区域名的指定(下文“域名和环境设置”会讲到)

  • 如果使用者没有条件实现多环境的域名支持,那么采用IP地址也可以

③ 根域(domain)名

  • 定义为不同环境域名的根域后缀

  • 实现占位处理,占位格式为 ${domain}

Polaris【北极星】企业级云原生微服务框架 使用者需要根据企业的实际情况,把组件的四个环境域名或者IP地址一一做更改

域名和环境设置

① 通过DevOps进行环境(env)号设置

  • 通过System Property或者-Denv= 环境号,进行设置

  • 通过server.properties进行设置

env=dev

  • 通过System Env环境变量方式进行设置

  • 上述设置都未执行,则缺省为dev

② 通过DevOps进行区域(region)名设置

  • 通过System Property或者-Dregion= 区域名,进行设置。例如,-Dregion=sh-pd,sh-pd表示双活或者多活的机房名(上海浦东机房),两者可以独立配置其中之一,也可以同时并存

  • 通过server.properties进行设置

region=sh-pd

  • 通过System Env环境变量方式进行设置

  • 上述设置都未执行,则缺省为空,即非多活或者多云的环境

③ 通过DevOps进行根域(domain)名设置

  • 通过System Property或者-Ddomain= 根域名,进行设置

  • 通过server.properties进行设置

domain=aliyun.com

  • 通过System Env环境变量方式进行设置

  • 上述设置都未执行,则缺省为PolarisEnvConstant类里的DOMAIN_VALUE静态变量

Polaris【北极星】企业级云原生微服务框架 读取优先级由高到低,如下

  • System.getProperty

  • System.getenv

  • server.properties。Windows环境下该文件路径为C:/opt/settings/server.properties,Linux环境下该文件路径为/opt/settings/server.properties。示例内容如下

domain=aliyun.com region=sh-pd env=pro

④ 通过PolarisEnvConstant类进行设置。请参考里面的中文注释

`public class PolarisEnvConstant {
    // 根域名相关定义。包含三种传值方式,优先级至上而下。使用者需要把根域值改掉
    // 1. 通过-Ddomain=nepxion.com或者System.setProperty("domain", "nepxion.com")方式进行传入
    // 2. 通过大写的DOMAIN,其值为nepxion.com的System ENV方式进行传入
    // 3. 通过DevOps在server.properties定义domain=nepxion.com方式进行传入
    public static final String DOMAIN_NAME = "domain";
    public static final String DOMAIN_VALUE = "nepxion.com";

    // 区域名相关定义。包含三种传值方式,优先级至上而下
    // 1. 通过-Dregion=sh-pd或者System.setProperty("region", "sh-pd")方式进行传入
    // 2. 通过大写的REGION,其值为sh-pd的System ENV方式进行传入
    // 3. 通过DevOps在server.properties定义region=sh-pd方式进行传入

    // 区域名分隔符相关定义
    // REGION_SEPARATE表示区域在域名中的分隔符
    // REGION_SEPARATE_PREFIX表示区域在域名中的分隔符是否在前面还是后面
    // 包含两种表现形式。特别注意:region占位符前后切记不要出现分隔符,因为框架会自动去适配
    // 1. 例如,原始格式为nacos-fat${region}.${domain}
    //    1.1 在region存在的情况下,会解析成nacos-fat-sh-pd.nepxion.com
    //    1.2 在region缺失的情况下,会解析成nacos-fat.nepxion.com
    // 2. 例如,原始格式为${region}fat-nacos.${domain}
    //    2.1 在region存在的情况下,会解析成sh-pd-fat-nacos.nepxion.com
    //    2.2 在region缺失的情况下,会解析成fat-nacos.nepxion.com
    public static final String REGION_NAME = "region";
    public static final String REGION_SEPARATE = "-";
    public static final boolean REGION_SEPARATE_PREFIX = true;

    // 环境名相关定义。包含三种传值方式,优先级至上而下。以开发环境为例
    // 1. 通过-Denv=dev或者System.setProperty("env", "dev")方式进行传入
    // 2. 通过大写的ENV,其值为dev的System ENV方式进行传入
    // 3. 通过DevOps在server.properties定义env=dev方式进行传入
    public static final String ENV_NAME = "env";

    // server.properties文件的存放位置
    public static final String SERVER_PROPERTIES_PATH_WINDOWS = "C:/opt/settings/server.properties";
    public static final String SERVER_PROPERTIES_PATH_LINUX = "/opt/settings/server.properties";

    // 日志文件的存放位置
    public static final String LOG_PATH_WINDOWS = "C:/opt/logs/";
    public static final String LOG_PATH_LINUX = "/opt/logs/";

    public static final String META_INF_PATH = "classpath:/META-INF/";
}
`

Polaris【北极星】企业级云原生微服务框架 特别注意:region占位符前后切记不要出现分隔符

Polaris【北极星】企业级云原生微服务框架 参考Polaris环境演示视频

使用步骤

Polaris【北极星】企业级云原生微服务框架 参考Polaris指南主页的源码

应用搭建

引入Parent

<parent>     <groupId>com.nepxion.polaris</groupId>     <artifactId>polaris-parent</artifactId>     <version>${polaris.version}</version> </parent>

引入Jar

① 微服务API二方包引入

<dependency>     <groupId>com.nepxion.polaris</groupId>     <artifactId>polaris-framework-starter-api</artifactId>     <version>${polaris.version}</version> </dependency>

② 微服务引入

<dependency>     <groupId>com.nepxion.polaris</groupId>     <artifactId>polaris-framework-starter-service</artifactId>     <version>${polaris.version}</version> </dependency>

③ Spring Cloud Gateway网关引入

<dependency>     <groupId>com.nepxion.polaris</groupId>     <artifactId>polaris-framework-starter-gateway</artifactId>     <version>${polaris.version}</version> </dependency>

④ Zuul网关引入

<dependency>     <groupId>com.nepxion.polaris</groupId>     <artifactId>polaris-framework-starter-zuul</artifactId>     <version>${polaris.version}</version> </dependency>

⑤ 控制台引入

<dependency>     <groupId>com.nepxion.polaris</groupId>     <artifactId>polaris-framework-starter-console</artifactId>     <version>${polaris.version}</version> </dependency>

⑥ 测试端引入

<dependency>     <groupId>com.nepxion.polaris</groupId>     <artifactId>polaris-framework-starter-test</artifactId>     <version>${polaris.version}</version> </dependency>

添加注解

下面四个注解封装了标准Spring Boot、Spring Cloud、Apollo、服务注册发现等多个注解,可以有效的降低业务使用成本

① 微服务引入

@EnablePolarisService public class PolarisApplication {     public static void main(String[] args) {         new SpringApplicationBuilder(PolarisApplication.class).run(args);     } }

② Spring Cloud Gateway网关引入

@EnablePolarisGateway public class PolarisApplication {     public static void main(String[] args) {         new SpringApplicationBuilder(PolarisApplication.class).run(args);     } }

③ Zuul网关引入

@EnablePolarisZuul public class PolarisApplication {     public static void main(String[] args) {         new SpringApplicationBuilder(PolarisApplication.class).run(args);     } }

④ 控制台引入

@EnablePolarisConsole public class PolarisApplication {     public static void main(String[] args) {         new SpringApplicationBuilder(PolarisApplication.class).run(args);     } }

添加配置

由于大量配置已经内置到框架里,除了服务名和端口号之外,业务层原则上不需要再添加Spring Cloud和中间件其它配置,当然也可以覆盖掉默认内置的配置。内置配置文件支持Spring标准占位符用法

Polaris【北极星】企业级云原生微服务框架 小诀窍:为了避免引起业务层的配置无法覆盖掉默认内置的配置,请在bootstrap.properties定义想要覆盖的配置

应用启动

中间件服务启动

Polaris【北极星】企业级云原生微服务框架 Polaris依赖Nacos Server(必选)和Skywalking Server(可选),请事先搭建好对应的Server

Spring-Boot应用启动

跟原生的Spring Boot应用程序启动方式一致。在IDE中,启动四个应用服务和两个网关服务,控制平台服务,如下

类名

微服务

服务端口

版本

区域

环境

可用区

PolarisServiceA1.java

A1

3001

1.0

dev

env1

zone1

PolarisServiceA2.java

A2

3002

1.1

qa

common

zone2

PolarisServiceB1.java

B1

4001

1.0

qa

env1

zone1

PolarisServiceB2.java

B2

4002

1.1

dev

common

zone2

PolarisGateway.java

Gateway

5001

1.0

PolarisZuul.java

Zuul

5002

1.0

PolarisConsole.java

Console

6001

1.0

Skywalking-Agent启动

获取Skywalking Agent,放置在指定目录(例如,C:/opt/apache-skywalking-apm-bin/agent/),通过-javaagent命令启动

Polaris-Agent启动

灰度路由Header和调用链Span在Hystrix线程池隔离模式下或者线程、线程池、@Async注解等异步调用Feign或者RestTemplate时,通过线程上下文切换会存在丢失Header的问题,通过下述步骤解决,同时适用于网关端和服务端。该方案可以替代Hystrix线程池隔离模式下的解决方案,也适用于其它有相同使用场景的基础框架和业务场景,例如:Dubbo

涵盖所有Java框架的异步场景,解决如下6个异步场景下丢失线程上下文的问题

  • @Async

  • Hytrix Thread Pool Isolation

  • Runnable

  • Callable

  • Single Thread

  • Thread Pool

在如下源码目录下获取Polaris Agent

polaris-platform\polaris-component\polaris-component-agent\polaris-component-agent-starter-cross-thread\agent

① 插件使用

  • polaris-agent.jar为Agent引导启动程序,JVM启动时进行加载;agent/plugin目录包含polaris-agent-plugin.jar为Polaris/Discovery框架自带的实现方案,业务系统可以自定义plugin,解决业务自己定义的上下文跨线程传递

  • 通过如下-javaagent启动

-javaagent:/agent/polaris-agent.jar -Dthread.scan.packages=com.abc;com.xyz

参数说明

  • /agent:Agent所在的目录,需要对应到实际的目录上

  • -Dthread.scan.packages:Runnable,Callable对象所在的扫描目录,该目录下的Runnable,Callable对象都会被装饰。该目录最好精细和准确,这样可以减少被装饰的对象数,提高性能,目录如果有多个,用“;”分隔

  • -Dthread.request.decorator.enabled:异步调用场景下在服务端的Request请求的装饰,当主线程先于子线程执行完的时候,Request会被Destory,导致Header仍旧拿不到,开启装饰,就可以确保拿到。默认为开启,根据实践经验,大多数场景下,需要开启这个开关

扫描目录thread.scan.packages定义,该参数只作用于服务侧,网关侧不需要加 1. @Async场景下的扫描目录为org.springframework.aop.interceptor 2. Hystrix线程池隔离场景下的扫描目录为com.netflix.hystrix 3. 线程、线程池的扫描目录为自定义Runnable,Callable对象所在类的目录

② 插件扩展

  • 根据规范开发一个插件,插件提供了钩子函数,在某个类被加载的时候,可以注册一个事件到线程上下文切换事件当中,实现业务自定义ThreadLocal的跨线程传递。参考:discovery-plugin-strategy-starter-agent-plugin模块的com.nepxion.discovery.plugin.strategy.starter.agent.plugin.service下的实现方式

  • plugin目录为放置需要在线程切换时进行ThreadLocal传递的自定义插件。业务自定义插件开发完后,放入到plugin目录下即可

具体步骤介绍,如下

  • 新建一个模块,引入如下依赖

<dependency>     <groupId>${project.groupId}</groupId>     <artifactId>discovery-plugin-strategy-starter-agent</artifactId>     <scope>provided</scope> </dependency>

  • 新建一个ThreadLocalHook类继承AbstractThreadLocalHook,参考GatewayStrategyContextHook

`public class GatewayStrategyContextHook extends AbstractThreadLocalHook {
    @Override
    public Object create() {
        // 从主线程的ThreadLocal里获取并返回上下文对象
        return GatewayStrategyContext.getCurrentContext().getExchange();
    }

    @Override
    public void before(Object object) {
        // 把create方法里获取到的上下文对象放置到子线程的ThreadLocal里
        if (object instanceof ServerWebExchange) {
            GatewayStrategyContext.getCurrentContext().setExchange((ServerWebExchange) object);
        }
    }

    @Override
    public void after() {
        // 线程结束,销毁上下文对象
        GatewayStrategyContext.clearCurrentContext();
    }
}
`

  • 新建一个Plugin类继承AbstractPlugin,参考DiscoveryGatewayPlugin

`public class DiscoveryGatewayPlugin extends AbstractPlugin {
    @Override
    protected String getMatcherClassName() {
        // 返回存储ThreadLocal对象的类名,由于插件是可以插拔的,所以必须是字符串形式,不允许是显式引入类
        return "com.nepxion.discovery.plugin.strategy.gateway.context.GatewayStrategyContext";
    }

    @Override
    protected String getHookClassName() {
        // 返回ThreadLocalHook类名
        return GatewayStrategyContextHook.class.getName();
    }
}
`

  • 定义SPI扩展,在src/main/resources/META-INF/services目录下定义SPI文件

名称为固定如下格式

com.nepxion.discovery.plugin.strategy.agent.plugin.Plugin

内容为Plugin类的全路径(以DiscoveryGatewayPlugin为例)

com.nepxion.discovery.plugin.strategy.agent.plugin.gateway.DiscoveryGatewayPlugin

  • 上述自定义插件的方式,即可解决使用者在线程切换时丢失ThreadLocal上下文的问题

启动参数

Agent启动参数

Polaris应用完整启动参数如下

  • 服务

PolarisServiceA(同步服务):

-javaagent:C:/opt/apache-skywalking-apm-bin/agent/skywalking-agent.jar -Dskywalking.agent.service_name=polaris-service-a -Dpolaris.skywalking.agent.version=1.0.0

PolarisServiceA(异步服务):

-javaagent:C:/opt/polaris-agent/polaris-agent.jar -Dthread.scan.packages=org.springframework.aop.interceptor;com.netflix.hystrix;com.nepxion.polaris.guide.service -javaagent:C:/opt/apache-skywalking-apm-bin/agent/skywalking-agent.jar -Dskywalking.agent.service_name=polaris-service-a -Dpolaris.skywalking.agent.version=1.0.0

PolarisServiceB(同步服务):

-javaagent:C:/opt/apache-skywalking-apm-bin/agent/skywalking-agent.jar -Dskywalking.agent.service_name=polaris-service-b -Dpolaris.skywalking.agent.version=1.0.0

  • 网关

PolarisZuul(同步网关):

-javaagent:C:/opt/apache-skywalking-apm-bin/agent/skywalking-agent.jar -Dskywalking.agent.service_name=polaris-zuul -Dpolaris.skywalking.agent.version=1.0.0

PolarisGateway(异步网关):

-javaagent:C:/opt/apache-skywalking-apm-bin/agent/skywalking-agent.jar -Dskywalking.agent.service_name=polaris-gateway -Dpolaris.skywalking.agent.version=1.0.0

Nepxion-Discovery启动参数

灰度蓝绿发布和环境隔离路由的元数据注册的启动参数如下,分别对应灰度蓝绿版本号,区域号,环境号,最后一项是启动的时候是否显示旗标为彩色,可以忽略

-Dmetadata.version=20200818-001 -Dmetadata.region=region1 -Dmetadata.env=env1 -Dmetadata.zone=zone1 -Dnepxion.banner.shown.ansi.mode=true

验证结果

Postman方式验证

  • 导入Postman的测试脚本postman.json(位于根目录下)

  • 执行“Polaris网关测试用例”,观察输出结果,5002端口对应的是Zuul网关,5001端口对应的是Spring Cloud Gateway网关

  • 执行“Polaris网关全链路侦测测试用例”,观察输出结果,5002端口对应的是Zuul网关,5001端口对应的是Spring Cloud Gateway网关

自动化测试方式验证

  • 运行PolarisTest,观察输出结果,自动化测试用例是否都通过

新增组件

以创建一个配置中心组件Etcd为例,请尽量严格遵守Polaris集成方式,保持风格统一

组件创建

① 按照如下结构进行目录创建,并编写相应的pom.xml

  • polaris-component

  • polaris-component-config-starter-etcd

  • polaris-component-config

② 在resource/META-INF下创建如下5个环境文件,并分别写入相应的配置。如何写入,请参照上文“域名和环境切换”章节

  • etcd-config-common.properties

  • etcd-config-dev.properties

  • etcd-config-fat.properties

  • etcd-config-pro.properties

  • etcd-config-uat.properties

③ 新建com.nepxion.polaris.component.config.etcd.context.EtcdEnvProcessor类

`public class EtcdEnvProcessor extends PolarisEnvPostProcessor {
    // 如果初始化环境的时候,如果还需要做其它处理,请继承process方法
    @Override
    public void process(ConfigurableEnvironment environment) throws Exception {
        // DO SOMETHING

        super.process(environment);

        // DO SOMETHING
    }

    // 如果初始化环境的时候,如果还需要做每条值做特殊处理,请继承processValue方法
    @Override
    protected String processValue(ConfigurableEnvironment environment, String key, String value) {
        // DO SOMETHING
        String newValue = doSomething(key, value);

        return super.processValue(environment, key, newValue);
    }

    // 返回环境的名称,其值对应为环境文件的前缀
    @Override
    public String getName() {
        return "etcd-config";
    }
}
`

④ 配置resource/META-INF/spring.factories

org.springframework.boot.env.EnvironmentPostProcessor=\ com.nepxion.polaris.component.config.etcd.context.EtcdEnvProcessor

组件聚合

① 在polaris-component-config-starter目录下的pom.xml,把polaris-component-config-starter-etcd加入,进行组件层面聚合,Polaris自动会将该组件在框架层面聚合

② 如果该组件不希望被绑死在框架层,也可以暴露给业务层,由业务开发自行引入

Nepxion-Discovery简介

核心功能

  • 基于Header传递的全链路灰度路由,网关为路由触发点。采用配置中心配置路由策略映射在网关过滤器中植入Header信息而实现,路由策略传递到全链路服务中。主要包括

  • 匹配路由。包括版本匹配路由、区域匹配路由、IP地址和端口匹配路由

  • 权重路由。包括版本权重路由、区域权重路由

  • 前端触发路由

  • 网关过滤器触发路由

  • 负载均衡策略类触发路由

  • 并行路由下的版本优选路由

  • 异步场景下的触发路由

  • 基于动态变更元数据的全链路灰度路由

  • 基于全局订阅式的全链路灰度路由

  • 基于服务下线实时性的流量绝对无损策略。支持全局订阅和Header全链路传递两种方式,主要包括

  • 通过全局唯一ID进行屏蔽。适用于Docker和Kubernetes上IP地址不确定的场景

  • 通过IP地址或者端口或者IP地址+端口进行屏蔽。适用于IP地址确定的场景

  • 基于规则订阅的全链路灰度发布。采用配置中心配置灰度规则映射在全链路服务而实现,所有服务都订阅一个共享配置。主要包括

  • 匹配发布。包括版本匹配发布、区域匹配发布

  • 权重发布。包括版本权重发布、区域权重发布

  • 基于灰度发布和灰度路由的多种组合式规则策略。主要包括

  • 全链路灰度条件命中和灰度匹配组合式策略

  • 全链路灰度条件权重和灰度匹配组合式策略

  • 前端灰度和网关灰度路由组合式策略

  • 全链路灰度权重和灰度匹配组合式规则

  • 基于多方式的规则策略推送。主要包括

  • 基于远程配置中心的规则策略订阅推送

  • 基于Swagger和Rest的规则策略推送

  • 基于图形化界面的规则策略推送

  • 基于组(Group)和黑白名单的全链路服务隔离和准入。主要包括

  • 服务注册发现准入。包括基于组(Group)黑白名单注册准入、基于IP地址黑白名单注册准入、基于最大注册数限制注册准入、基于IP地址黑白名单发现准入

  • 消费端服务隔离。包括基于组(Group)负载均衡隔离

  • 提供端服务隔离。包括基于组(Group)Header传值策略隔离

  • 基于Env的全链路环境隔离和路由。主要包括

  • 环境隔离。基于服务实例的元数据Metadata的env参数和全链路传递的环境Header值进行比对实现隔离

  • 环境路由。基于调用端实例找不到符合条件的提供端实例,把流量路由到一个通用或者备份环境

  • 基于Zone的全链路可用区亲和性隔离和路由。主要包括

  • 可用区亲和性隔离。基于调用端实例和提供端实例的元数据Metadata的zone配置值相等实现隔离

  • 可用区亲和性路由。基于调用端实例找不到同一可用区的提供端实例,把流量路由到其它可用区或者不归属任何可用区

  • 基于Sentinel的全链路服务限流熔断降级权限。除了支持Sentinel原生五个相关规则外,扩展LimitApp的机制,整合灰度路由,通过动态的Http Header方式实现组合式防护机制。主要包括

  • 基于服务名的防护

  • 基于灰度组的防护

  • 基于灰度版本的防护

  • 基于灰度区域的防护

  • 基于IP地址和端口的防护

  • 基于自定义业务参数的组合式防护机制

  • 基于Hystrix的全链路服务限流熔断和灰度融合

  • 全链路监控。主要包括

  • 全链路调用链监控(Tracing)

  • 全链路日志监控(Logging)

  • 全链路指标监控(Metrics)

  • 全链路Header传递

  • 全链路侦测

  • 全链路服务侧注解

  • 全链路服务侧API权限

  • 异步跨线程Agent。主要包括

  • 插件获取

  • 插件使用

  • 插件扩展

  • 元数据Metadata自动化策略。主要包括

  • 基于服务名前缀自动创建灰度组名

  • 基于Git插件自动创建灰度版本号

  • 元数据Metadata运维平台策略

  • 同城双活多机房切换。基于区域匹配发布或者路由的同城双活多机房切换

  • 数据库和消息队列灰度发布。基于多Datasource的数据库灰度发布,基于多Queue的消息队列灰度发布

  • 灰度路由和发布的自动化测试。主要包括

  • 基于Spring Boot/Spring Cloud自动化测试,包括普通调用测试、灰度调用测试和扩展调用测试

  • 基于WRK的性能压力测试

  • Docker容器化和Kubernetes平台的无缝支持部署

架构模型

  • 灰度方式区别图

Polaris【北极星】企业级云原生微服务框架

  • 服务治理架构图

Polaris【北极星】企业级云原生微服务框架

  • 模块结构图 Polaris【北极星】企业级云原生微服务框架

① 基于网关为触点的Header传递的全链路灰度路由,适用于网关前置部署方式的企业。域网关部署模式下,最适用于该方式;非域网关部署模式下,开启并行灰度路由下的版本优选策略

② 基于全局订阅方式的全链路灰度发布,适用于网关部署方式比较弱化的企业

③ 基于全局订阅和Header传递组合式全链路灰度路由,上述两种方式的结合体,是比较理想和节省成本的落地方式

订阅推送

  • Apollo订阅推送界面

Polaris【北极星】企业级云原生微服务框架

  • Nacos订阅推送界面

Polaris【北极星】企业级云原生微服务框架

监控追踪

  • Jaeger监控追踪界面

Polaris【北极星】企业级云原生微服务框架

  • Skywalking监控追踪界面

Polaris【北极星】企业级云原生微服务框架

Spring-Boot-2-3-x新特性

容器化部署

基于Spring Boot 2.3.x新特性制作的Docker容器化部署

部署Polaris框架包

Polaris【北极星】企业级云原生微服务框架 重要提醒,由于Polaris框架包未推送到Maven中央仓库,需要使用者自行编译部署。在Polaris源码的polaris-parent和polaris-platform工程目录下,分别执行如下命令,把Polaris框架相关包部署到本地仓库

mvn clean install -U -DskipTests

添加Spring-Boot打包插件

Polaris指南的polaris-guide-service-a工程为例,下同

在polaris-guide-service-a工程目录下的pom.xml,执行如下操作

<plugin>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-maven-plugin</artifactId>     <version>2.3.3.RELEASE</version>     <configuration>         <mainClass>com.nepxion.polaris.guide.service.PolarisServiceA1</mainClass>         <layout>JAR</layout>         <layers>             <enabled>true</enabled>         </layers>     </configuration>     <executions>         <execution>             <goals>                 <goal>repackage</goal>             </goals>             <configuration>                 <attach>false</attach>             </configuration>         </execution>     </executions> </plugin>

Polaris【北极星】企业级云原生微服务框架 重要提醒,相对旧版本的spring-boot-maven-plugin,新版本增加了如下配置参数,用来支持镜像Layer分层,加快打包部署的速度

<layers>     <enabled>true</enabled> </layers>

Polaris【北极星】企业级云原生微服务框架 重要提醒,旧版的如下参数必须删除!否则无法创建镜像分层

<configuration>     <executable>true</executable> </configuration>

执行Docker容器和镜像的制作和运行

Polaris【北极星】企业级云原生微服务框架 如果是Windows操作系统,需要在环境变量里配置DOCKER_HOST=tcp://localhost:2375

在polaris-guide-service-a工程目录下,执行如下操作

① 执行如下命令,编译Jar包

mvn clean package -U -DskipTests

② 验证镜像Layer分层(*非必须执行的步骤)

执行如下命令,查看Layer分层

java -Djarmode=layertools -jar target/polaris-guide-service-a-0.0.1.jar list

控制台输出如下四个分层,则表示有效

dependencies spring-boot-loader snapshot-dependencies application

③ 创建Dockerfile

application.jar包同级目录下,将会输出四个分层的目录和文件

制作Dockerfile放在polaris-guide-service-a工程目录下。内置解压命令,根据jar构建生成清单layers.idx解压提取每个Layer要写入镜像的内容。内容如下

`# 指定基础镜像,这是分阶段构建的前期阶段
FROM openjdk:8-jre-alpine as builder
# 执行工作目录
WORKDIR application
# 配置参数
ARG JAR_FILE=target/*.jar
# 将编译构建得到的jar文件复制到镜像空间中
COPY ${JAR_FILE} application.jar
# 通过工具spring-boot-jarmode-layertools从application.jar中提取拆分后的构建结果
RUN java -Djarmode=layertools -jar application.jar extract

正式构建镜像

FROM openjdk:8-jre-alpine
WORKDIR application
# 前一阶段从jar中提取除了多个文件,这里分别执行COPY命令复制到镜像空间中,每次COPY都是一个layer
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/spring-boot-loader/ ./
COPY --from=builder application/snapshot-dependencies/ ./
COPY --from=builder application/application/ ./
# -Djava.security.egd=file:/dev/./urandom 内核随机种子,防止启动很慢
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom org.springframework.boot.loader.JarLauncher"]
`

④ 创建镜像和容器

执行如下命令创建镜像和容器

docker build . --tag polaris-guide-service-a

⑤ 运行容器

执行如下命令运行容器

`set METADATA_VERSION=my-version
set METADATA_REGION=my-region
set METADATA_ENV=my-env
set METADATA_ZONE=my-zone

docker run -i -t -e JAVA_OPTS="-Dnepxion.banner.shown.ansi.mode=true -Dmetadata.version=%METADATA_VERSION% -Dmetadata.region=%METADATA_REGION% -Dmetadata.env=%METADATA_ENV% -Dmetadata.zone=%METADATA_ZONE%" -e TZ="Asia/Shanghai" -p 3001:3001 -h polaris-guide-service-a --name polaris-guide-service-a polaris-guide-service-a:latest
`

Polaris【北极星】企业级云原生微服务框架 在DEV(本地)环境下,配置Docker容器不能通过127.0.0.1的IP地址连接容器外中间件服务器,故需要把启动命令改成如下形式。域名方式则不需要这么做

`set NACOS_SERVER=10.0.75.1:8848

docker run %RUN_MODE% -e JAVA_OPTS="-Dspring.cloud.nacos.discovery.server-addr=%NACOS_SERVER% -Dspring.cloud.nacos.config.server-addr=%NACOS_SERVER% -Dspring.cloud.sentinel.datasource.nacos.server-addr=%NACOS_SERVER% -Dnacos.server-addr=%NACOS_SERVER% -Dnepxion.banner.shown.ansi.mode=%SHOWN_ANSI_MODE% -Dmetadata.version=%METADATA_VERSION% -Dmetadata.region=%METADATA_REGION% -Dmetadata.env=%METADATA_ENV% -Dmetadata.zone=%METADATA_ZONE%" -e TZ="Asia/Shanghai" -p %MACHINE_PORT%:%CONTAINER_PORT% -h %IMAGE_NAME% --name %IMAGE_NAME% %IMAGE_NAME%:latest
`

Polaris【北极星】企业级云原生微服务框架 上述所有的命令组装成一键启动方式的脚本:install-docker.bat和install-docker.sh,请参考polaris-guide-service-a工程目录下的相应脚本

⑥ Docker运行效果

  • Docker Desktop

Polaris【北极星】企业级云原生微服务框架

  • Docker Windows

Polaris【北极星】企业级云原生微服务框架

  • Docker Linux

Polaris【北极星】企业级云原生微服务框架

⑦ 官方部署Docker文档

Polaris【北极星】企业级云原生微服务框架 参考Spring Boot 2.3.x官方部署Docker文档获取更多用法,但请谨慎使用,有不少错误的地方,可能是来不及更新

优雅停机

`# 开启Spring Boot 2.3.x优雅停机
server.shutdown=graceful

优雅停机缓冲时间

spring.lifecycle.timeout-per-shutdown-phase=20s
`

回馈社区

  • 使用者可以添加更多的中间件到框架里,并希望能回馈给社区

  • 使用者可以根据企业实际情况,添加更多的配置到框架层并优化内置的参数,并希望能回馈给社区

本文分享自微信公众号 - Nepxion开源社区(iMicroService)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
2个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这