mica-launcher 微服务启动器的设计和使用

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 前言微服务中规范往往比代码更加重要,一些良好的规范,能让我们少走弯路。mica-launcher 启动器就是对服务名和服务环境进行了定制的处理,使得企业开发更加方便快捷。服务名规范服务名在微服务中起着至关重要的位置,一个好的服务名应该见名知意。

前言

微服务中规范往往比代码更加重要,一些良好的规范,能让我们少走弯路。mica-launcher 启动器就是对服务名和服务环境进行了定制的处理,使得企业开发更加方便快捷。

服务名规范

服务名在微服务中起着至关重要的位置,一个好的服务名应该见名知意。下面是笔者在工作中总结的规范。

小开发团队-两级

例如:user-api

  1. 第一级 服务名
  2. 第二级 服务类型

多个开发团队-三级

将组名放到第一位,方便快速定位到技术组。

例如:mica-user-api

  1. 第一级 组名
  2. 第二级 服务名
  3. 第三级 服务类型

环境划分

愿景

启动器的使命就是让我们的 jar 在各种环境中都可以方便启动,不用添加过多的配置,减少新同学的学习成本,能快速上手。提供了环境的日志打印,避免启动期间的各种问题。

环境划分

dev(开发)、test(测试)、ontest(线上测试)、prod(正式),默认dev

启动环境变量

java命令行:

java -jar app.jar --spring.profiles.active=dev

JAVA_OPS

set JAVA_OPTS="-Dspring.profiles.active=test"

标注方式(代码层面,junit单元测试非常实用)

@ActiveProfiles({"junittest","productprofile"})

ENV方式

系统环境变量 SPRING_PROFILES_ACTIVE(注意:是大写)

背景故事

mica-launcher 最早的雏形初现在笔者的一些 JFinal 项目中,期初主要是为了适应开发阶段的 jetty 和正式环境的 tomcat 日志目录。
easy-JFinal.png

在 Spring boot 中我便设计了 mica-launcher 来处理服务环境,使其更加方便好用。

使用

使用起来比原生的 spring boot 启动器里多了一个服务名参数,微服务中服务名对一个服务特别重要,故在启动器启动时写死。

Maven

<dependency>
    <groupId>net.dreamlu</groupId>
    <artifactId>mica-launcher</artifactId>
</dependency>

Gradle

implementation "net.dreamlu:mica-launcher"
@SpringBootApplication
public class MicaExampleApplication {

    public static void main(String[] args) {
        MicaApplication.run("mica-example", MicaExampleApplication.class, args);
    }
}

注意:使用了 mica-launcher 启动器,需要结合 mica-test 进行单元测试,具体文章请查看 mica test 单元测试

启动器自动化配置

代码中可以采用注入 MicaProperties 来读取启动器中的一些变量,比如 env 等。
mica.prop 可以在配置文件中自定义配置。然后再在代码中使用 MicaProperties 读取。

配置项 默认值 说明
mica.env dev 【只读】mica 环境变量,方便在代码中获取,设置无效.
mica.is-local false 【只读】判断是否为 本地开发环境
mica.prop 装载自定义配置 mica.prop.xxx

自定义配置

mica:
  prop:
    site-name: 如梦技术
    site-url: https://www.dreamlu.net

配置读取

@Autowired
private MicaProperties micaProperties;
public boolean savePost() {
    String siteName = micaProperties.get("site-name");
    String siteUrl = micaProperties.get("site-url");
    // .....
}

启动器插件扩展

启动器的主要目的是能更加方便的去注入一些通用配置,降低使用难度。mica-log4j2 就是一个启动器的扩展。
插件扩展基于 java SPI 技术,关于 java SPI 具体使用可以百度。

实现 LauncherService,重写 launcher 方法

下面是 LauncherService 的代码。

/**
 * launcher 扩展 用于一些组件发现
 *
 * @author L.cm
 */
public interface LauncherService {
   /**
    * 启动时 处理 SpringApplicationBuilder
    * @param builder SpringApplicationBuilder
    * @param env 系统变量 Environment
    * @param appName 服务名
    * @param profile 环境变量
    * @param isLocalDev 是否本地开发
    */
   void launcher(SpringApplicationBuilder builder, Environment env, String appName, String profile, boolean isLocalDev);
}

编写 SPI 文件放置到 resources 目录下

文件路径和文件名 META-INF/services/net.dreamlu.mica.launcher.LauncherService
内容为你编写的插件完整类名,例如:net.dreamlu.mica.log.LogLauncherServiceImpl

最佳实践

mica-launcher 中我们预制了环境变量,您可以再服务里将配置中心按环境来划分域名。在配置中可以使用 ${mica.env} 占位符完成配置。

例如:(配置服务域名)

config-dev.dreamlu.net
config-test.dreamlu.net
......

使用示例:

spring:
  cloud:
    consul:
      host: https://config-${mica.env}.dreamlu.vip
      port: 8500
      config:
        format: yaml

开源推荐

目录
相关文章
|
Java 数据库连接 定位技术
|
缓存 监控 Cloud Native
设计稳定的微服务系统时不得不考虑的场景
我们的生产环境经常会出现一些不稳定的情况,如: 1、大促时瞬间洪峰流量导致系统超出最大负载,load 飙高,系统崩溃导致用户无法下单 2、“黑马”热点商品击穿缓存,DB 被打垮,挤占正常流量 3、调用端被不稳定服务拖垮,线程池被占满,导致整个调用链路卡死 这些不稳定的场景可能会导致严重后果。大家可能想问:如何做到均匀平滑的用户访问?如何预防流量过大或服务不稳定带来的影响?
设计稳定的微服务系统时不得不考虑的场景
|
消息中间件 安全 NoSQL
SpringCloud微服务实战——搭建企业级开发框架(三十七):微服务日志系统设计与实现【上】
针对业务开发人员通常面对的业务需求,我们将日志分为操作(请求)日志和系统运行日志,操作(请求)日志可以让管理员或者运营人员方便简单的在系统界面中查询追踪用户具体做了哪些操作,便于分析统计用户行为;系统运行日志又分为不同的级别(Log4j2): OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL,这些日志级别由开发人员在代码编写时确定,并编写在代码中,系统运行时记录,方便系统开发人员分析定位解决问题,查找系统性能瓶颈。
817 57
SpringCloud微服务实战——搭建企业级开发框架(三十七):微服务日志系统设计与实现【上】
|
消息中间件 缓存 NoSQL
SpringCloud微服务实战——搭建企业级开发框架(三十七):微服务日志系统设计与实现【下】
针对业务开发人员通常面对的业务需求,我们将日志分为操作(请求)日志和系统运行日志,操作(请求)日志可以让管理员或者运营人员方便简单的在系统界面中查询追踪用户具体做了哪些操作,便于分析统计用户行为;系统运行日志又分为不同的级别(Log4j2): OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL,这些日志级别由开发人员在代码编写时确定,并编写在代码中,系统运行时记录,方便系统开发人员分析定位解决问题,查找系统性能瓶颈。
657 56
SpringCloud微服务实战——搭建企业级开发框架(三十七):微服务日志系统设计与实现【下】
|
SQL 安全 Java
微服务API开放授权平台的设计与实现
微服务API开放授权平台的设计与实现
微服务API开放授权平台的设计与实现
|
存储 缓存 NoSQL
微服务实践01--微服务管理11--缓存02--分级缓存设计
微服务实践01--微服务管理11--缓存02--分级缓存设计
329 0
微服务实践01--微服务管理11--缓存02--分级缓存设计
|
监控 数据可视化 Cloud Native
如何选择和设计微服务网关
微服务架构中网关的设计以及技术分析
433 0
如何选择和设计微服务网关
|
SQL 存储 关系型数据库
索引设计—高并发场景微服务实战(六)
你好,我是程序员Alan,很高兴遇见你. 我在上一篇文章《 表结构设计—高并发场景微服务实战(五)》中,详细的写了如何选择合适的类型创建一张表,但表结构设计只是设计数据库最初的环节之一,我们还缺少数据库设计中最为重要的一个环节——索引设计,只有正确设计索引,业务才能达到上线的初步标准。 索引如果展开来讲有很多需要关注的地方,例如索引设计、业务应用与调优等等,本篇文章我会重点讲一下索引设计相关知识
156 0
索引设计—高并发场景微服务实战(六)
|
存储 运维 前端开发
表结构设计—高并发场景微服务实战(五)
你好,我是程序员Alan。 这篇文章我会详细讲一下设计表结构时我会重点关注的地方,助你少走弯路。
225 0
表结构设计—高并发场景微服务实战(五)
|
缓存 监控 Cloud Native
设计稳定的微服务系统时不得不考虑的场景
本文将介绍两种方式,是在面对流量不稳定因素时常见的两种方案,也是我们在设计高可用的系统前不得不考虑的两种能力,是服务流量治理中非常关键的一环。
设计稳定的微服务系统时不得不考虑的场景