配置

    • 描述
    • 读取配置
    • 注入配置
    • 动态配置
    • 注解配置
    • 配置实体类
    • 开启 Nacos 分布式配置中心
    • 开启 Apollo 分布式配置中心
    • 配置内容加密解密
    • 设计原因
    • 常见问题
    • Jboot所有配置参考

    描述

    • jboot.properties 配置文件
    • 环境变量
    • Jvm 系统属性
    • 启动参数
    • 分布式配置中心(目前支持 Apollo 和 Nacos)

    读取配置

    注入配置

    1. public class AopController extends JbootController {
    2. @ConfigValue("undertow.host")
    3. private String host;
    4. @ConfigValue("undertow.port")
    5. private int port;
    6. public void index(){
    7. renderText("host:" + host +" port:" + port);
    8. }
    9. }

    在 Jboot 的所有配置中,我们可以通过 ${key} 来指定替换为 value。

    示例1:

    1. key1 = value1
    2. key2 = ${key1}/abc

    那么读取到的 key2 的值为 value1/abc

    示例2:

    1. key1 = value1
    2. key2 = ${key1}/abc
    3. key3 = abc/${key2}/xyz

    那么,key2 的值为 value1/abc ,key3 的值为 abc/value1/abc/xyz

    示例2:

    1. key1 = value1
    2. key2 = ${otherkey}/abc

    那么,因为系统中找不到 otherkey 的值,key2 的值为 /abc,如果我们在系统中,通过 java -jar xxx.jar --otherkey=othervalue, 那么, key2 的值为 othervalue/abc

    注解配置

    在应用开发中,我们通常会使用注解,Jboot 内置了多个注解。

    例如:

    • @RequestMapping
    • @EnableCORS
    • @RPCInject
    • @RPCBean
    • …等等

    在使用注解的时候,我们通常会这样来使用,例如:

    1. @RequestMapping("/user")
    2. public class UserController extends Controller{
    3. //....
    4. }

    或者

    但是,无论是 @RequestMapping("/user") 或者是 @RPCBean(group="myGroup",version="myVersion",port=...) , 其参数配置都是固定的,因此,Jboot 提供了一种动态的配置方法,可以用于读取配置文件的内容。

    例如:

    1. @RequestMapping("${user.mapping}/abc")
    2. public class UserController extends Controller{
    3. //....
    4. }

    然后在配置文件 jboot.properties (也可以是启动参数、环境变量等)添加上:

    1. user.mapping = /user

    其作用是等效于:

    1. @RequestMapping("/use/abcr")
    2. public class UserController extends Controller{
    3. //....
    4. }

    配置实体类

    很多时候,某个功能或组件可能需要 一堆 的配置,而不是一个配置,无论是手动编码读取 或者 是通过注入,就可以让我们的项目产生重复的代码。

    Jboot 提供了配置实体类功能,该功能自动把配置信息 映射 给一个 JavaBean 实体类,方便我们 批量 读取配置信息。

    例如:

    某个组件叫 component1 ,它需要如下几个配置信息。

    • 主机
    • 端口号
    • 账号
    • 密码
    • 超时时间

    那么,我们可以创建一个叫 Component1Config 的实体类,定义好其属性,如下代码 :

    1. @ConfigModel(prefix="component1")
    2. public class Component1Config{
    3. private String host;
    4. private int port;
    5. private String accout;
    6. private String password;
    7. private long timeout;
    8. // 下方应该还有 getter setter, 略
    9. }

    这样,我们就可以通过如下代码读 Component1Config 信息。

    1. Component1Config config = Jboot.config(Component1Config.class);

    开启 Nacos 分布式配置中心

    第一步,添加 nacos 客户端的 Maven 依赖

    第二步:启动 nacos

    如何启动 nacos 的相关文档在

    https://nacos.io/zh-cn/docs/quick-start.html

    或者

    第三步,在 jboot.properties 添加如下配置

    1. jboot.config.nacos.enable = true
    2. jboot.config.nacos.serverAddr = 127.0.0.1:8848
    3. jboot.config.nacos.dataId = jboot
    4. jboot.config.nacos.group = jboot

    支持如下更多配置,但是最简单的只需要以上配置就可以正常运行

    1. jboot.config.nacos.isUseCloudNamespaceParsing = xxx
    2. jboot.config.nacos.isUseEndpointParsingRule = xxx
    3. jboot.config.nacos.endpoint = xxx
    4. jboot.config.nacos.endpointPort = xxx
    5. jboot.config.nacos.namespace = xxx
    6. jboot.config.nacos.username = xxx
    7. jboot.config.nacos.password = xxx
    8. jboot.config.nacos.accessKey = xxx
    9. jboot.config.nacos.secretKey = xxx
    10. jboot.config.nacos.ramRoleName = xxx
    11. jboot.config.nacos.serverAddr = xxx
    12. jboot.config.nacos.contextPath = xxx
    13. jboot.config.nacos.clusterName = xxx
    14. jboot.config.nacos.encode = xxx
    15. jboot.config.nacos.configLongPollTimeout = xxx
    16. jboot.config.nacos.configRetryTime = xxx
    17. jboot.config.nacos.maxRetry = xxx
    18. jboot.config.nacos.enableRemoteSyncConfig = xxx

    第一步:添加 Apollo 客户端的 Maven 依赖

    1. <dependency>
    2. <groupId>com.ctrip.framework.apollo</groupId>
    3. <artifactId>apollo-client</artifactId>
    4. <version>1.7.0</version>

    相关文档在 https://github.com/ctripcorp/apollo/wiki/Quick-Start

    第三步,在 jboot.properties 添加如下配置

    1. jboot.config.apollo.enable = true
    2. jboot.config.apollo.appId = SampleApp
    3. jboot.config.apollo.meta = http://106.54.227.205:8080

    配置内容加密解密

    为了安全起见,很多时候我们需要对配置里的一些安全和隐私内容进行加密,比如数据库的账号密码等,防止web服务器被黑客入侵时保证数据库的安全。

    配置的内容加密是由用户自己编写加密算法。此时,Jboot 读取的只是加密的内容,为了能正常还原解密之后的内容,用户需要给 JbootConfigManager 配置上解密的实现 JbootConfigDecryptor。

    一般情况下,我们需要在 JbootAppListener 的 onInit() 里去配置。例如:

    1. public MyApplicationListener implements JbootAppListener {
    2. public void onInit() {
    3. JbootConfigManager.me().setDecryptor(new MyConfigDecriptor());
    4. }
    5. }

    我们需要在 MyConfigDecriptor 的 方法里去实现自己的解密算法。例如:

    设计原因

    由于 Jboot 定位是微服务框架,同时 Jboot 假设:基于 Jboot 开发的应用部署在 Docker 之上。

    因此,在做 Devops 的时候,编排工具(例如:k8s、mesos)会去修改应用的相关配置,而通过环境变量和启动配置,无疑是最方便快捷的。

    常见问题

    1、如何设置启动参数 ?

    2、如何设置 Jvm 系统属性 ?

    3、如何设置系统环境变量 ?

    注意:在设置的系统环境变量的key、value中,例如:jboot.app.mode = dev 可以修改为 JBOOT_APP_MODE = dev ,其他同理把全部小写 修改为大写,符号点(.)修改为下划线(_)。

    参考 这里

    Jboot 其他配置参考

    1. undertow.devMode=true # 设置undertow为开发模式
    2. undertow.port=80 #undertow 的端口号,默认 8080,配置 * 为随机端口
    3. undertow.host=0.0.0.0 #默认为localhost
    4. undertow.resourcePath = src/main/webapp, classpath:static
    5. undertow.ioThreads=
    6. undertow.workerThreads=
    7. undertow.gzip.enable=true # gzip 压缩开关
    8. undertow.gzip.level=-1 # 配置压缩级别,默认值 -1。 可配置 1 到 9。 1 拥有最快压缩速度,9 拥有最高压缩率
    9. undertow.gzip.minLength=1024 # 触发压缩的最小内容长度
    10. undertow.session.timeout=1800 # session 过期时间,注意单位是秒
    11. undertow.session.hotSwap=true # 支持 session 热加载,避免依赖于 session 的登录型项目反复登录,默认值为 true。仅用于 devMode,生产环境无影响
    12. undertow.ssl.enable=false # 是否开启 ssl
    13. undertow.ssl.port=443 # ssl 监听端口号,部署环境设置为 443
    14. undertow.ssl.keyStoreType=PKCS12 # 密钥库类型,建议使用 PKCS12
    15. undertow.ssl.keyStore=demo.pfx # 密钥库文件
    16. undertow.ssl.keyStorePassword=123456 # 密钥库密码
    17. undertow.ssl.keyAlias=demo # 别名配置,一般不使用
    18. undertow.http2.enable=true # ssl 开启时,是否开启 http2
    19. undertow.http.toHttps=false # ssl 开启时,http 请求是否重定向到 https
    20. undertow.http.toHttpsStatusCode=302 # ssl 开启时,http 请求跳转到 https 使用的状态码,默认值 302
    21. undertow.http.disable=false # ssl 开启时,是否关闭 http
    22. jboot.app.mode
    23. jboot.app.bannerEnable
    24. jboot.app.bannerFile
    25. jboot.app.jfinalConfig
    26. jboot.web.webSocketEndpoint
    27. jboot.web.cookieEncryptKey
    28. jboot.web.session.cookieName
    29. jboot.web.session.cookieDomain
    30. jboot.web.session.cookieContextPath
    31. jboot.web.session.maxInactiveInterval
    32. jboot.web.session.cookieMaxAge
    33. jboot.web.session.cacheName
    34. jboot.web.session.cacheType
    35. jboot.web.jwt.httpHeaderName
    36. jboot.web.jwt.secret
    37. jboot.web.jwt.validityPeriod
    38. jboot.web.cdn.enable
    39. jboot.web.cdn.domain
    40. jboot.datasource.name
    41. jboot.datasource.type
    42. jboot.datasource.url
    43. jboot.datasource.user
    44. jboot.datasource.password
    45. jboot.datasource.driverClassName = com.mysql.jdbc.Driver
    46. jboot.datasource.connectionInitSql
    47. jboot.datasource.poolName
    48. jboot.datasource.cachePrepStmts = true
    49. jboot.datasource.prepStmtCacheSize = 500
    50. jboot.datasource.prepStmtCacheSqlLimit = 2048
    51. jboot.datasource.maximumPoolSize = 10
    52. jboot.datasource.maxLifetime
    53. jboot.datasource.idleTimeout
    54. jboot.datasource.minimumIdle = 0
    55. jboot.datasource.sqlTemplatePath
    56. jboot.datasource.sqlTemplate
    57. jboot.datasource.factory
    58. jboot.datasource.shardingConfigYaml
    59. jboot.datasource.dbProFactory
    60. jboot.datasource.containerFactory
    61. jboot.datasource.transactionLevel
    62. jboot.datasource.table //此数据源包含哪些表
    63. jboot.datasource.exTable //该数据源排除哪些表
    64. jboot.datasource.dialectClass
    65. jboot.datasource.activeRecordPluginClass
    66. jboot.datasource.needAddMapping = true //是否需要添加到映射,当不添加映射的时候,只能通过 model.use("xxx").save()这种方式去调用该数据源
    67. jboot.mq.type
    68. jboot.mq.channel
    69. jboot.mq.serializer
    70. jboot.mq.syncRecevieMessageChannel
    71. jboot.mq.redis.host
    72. jboot.mq.redis.port
    73. jboot.mq.redis.password
    74. jboot.mq.redis.database
    75. jboot.mq.redis.timeout
    76. jboot.mq.redis.clientName
    77. jboot.mq.redis.testOnCreate
    78. jboot.mq.redis.testOnBorrow
    79. jboot.mq.redis.testOnReturn
    80. jboot.mq.redis.testWhileIdle
    81. jboot.mq.redis.minEvictableIdleTimeMillis
    82. jboot.mq.redis.timeBetweenEvictionRunsMillis
    83. jboot.mq.redis.numTestsPerEvictionRun
    84. jboot.mq.redis.maxAttempts
    85. jboot.mq.redis.maxTotal
    86. jboot.mq.redis.maxIdle
    87. jboot.mq.redis.maxWaitMillis
    88. jboot.mq.redis.serializer
    89. jboot.mq.redis.type
    90. jboot.mq.rabbitmq.username
    91. jboot.mq.rabbitmq.password
    92. jboot.mq.rabbitmq.port
    93. jboot.mq.qpid.host
    94. jboot.mq.qpid.username
    95. jboot.mq.qpid.password
    96. jboot.mq.qpid.virtualHost
    97. jboot.mq.aliyun.accessKey
    98. jboot.mq.aliyun.secretKey
    99. jboot.mq.aliyun.addr
    100. jboot.mq.aliyun.producerId
    101. jboot.mq.aliyun.sendMsgTimeoutMillis
    102. jboot.mq.zbus.queue
    103. jboot.mq.zbus.broker
    104. jboot.cache.type
    105. jboot.cache.ehcache.configFileName
    106. jboot.cache.redis.host
    107. jboot.cache.redis.port
    108. jboot.cache.redis.password
    109. jboot.cache.redis.database
    110. jboot.cache.redis.timeout
    111. jboot.cache.redis.clientName
    112. jboot.cache.redis.testOnCreate
    113. jboot.cache.redis.testOnBorrow
    114. jboot.cache.redis.testOnReturn
    115. jboot.cache.redis.testWhileIdle
    116. jboot.cache.redis.minEvictableIdleTimeMillis
    117. jboot.cache.redis.timeBetweenEvictionRunsMillis
    118. jboot.cache.redis.numTestsPerEvictionRun
    119. jboot.cache.redis.maxAttempts
    120. jboot.cache.redis.maxTotal
    121. jboot.cache.redis.maxIdle
    122. jboot.cache.redis.maxWaitMillis
    123. jboot.cache.redis.serializer
    124. jboot.cache.redis.type
    125. jboot.schedule.cron4jFile
    126. jboot.schedule.poolSize
    127. jboot.model.scan
    128. jboot.model.columnCreated
    129. jboot.model.columnModified
    130. jboot.model.idCacheEnable
    131. jboot.model.idCacheType
    132. jboot.model.idCacheTime
    133. jboot.metric.url
    134. jboot.metric.reporter
    135. jboot.metric.reporter.cvr.path
    136. jboot.metric.reporter.graphite.host
    137. jboot.metric.reporter.graphite.port
    138. jboot.metric.reporter.graphite.prefixedWith
    139. jboot.wechat.debug
    140. jboot.wechat.appId
    141. jboot.wechat.appSecret
    142. jboot.wechat.token
    143. jboot.wechat.partner
    144. jboot.wechat.paternerKey
    145. jboot.wechat.cert
    146. jboot.shiro.loginUrl
    147. jboot.shiro.successUrl
    148. jboot.shiro.unauthorizedUrl
    149. jboot.shiro.ini
    150. jboot.shiro.urlMapping
    151. jboot.shiro.invokeListener
    152. jboot.serializer.type
    153. jboot.swagger.path
    154. jboot.swagger.title
    155. jboot.swagger.description
    156. jboot.swagger.version
    157. jboot.swagger.termsOfService
    158. jboot.swagger.host
    159. jboot.swagger.contactName
    160. jboot.swagger.contactEmail
    161. jboot.swagger.contactUrl
    162. jboot.swagger.licenseName
    163. jboot.swagger.licenseUrl
    164. jboot.http.type
    165. jboot.redis.host
    166. jboot.redis.port
    167. jboot.redis.password
    168. jboot.redis.database
    169. jboot.redis.timeout
    170. jboot.redis.clientName
    171. jboot.redis.testOnCreate
    172. jboot.redis.testOnBorrow
    173. jboot.redis.testOnReturn
    174. jboot.redis.testWhileIdle
    175. jboot.redis.minEvictableIdleTimeMillis
    176. jboot.redis.timeBetweenEvictionRunsMillis
    177. jboot.redis.numTestsPerEvictionRun
    178. jboot.redis.maxAttempts
    179. jboot.redis.maxTotal
    180. jboot.redis.maxIdle
    181. jboot.redis.maxWaitMillis
    182. jboot.redis.serializer
    183. jboot.redis.type
    184. jboot.limit.enable
    185. jboot.limit.rule
    186. jboot.limit.fallbackProcesser
    187. jboot.limit.defaultHttpCode