配置

目录

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

描述

在 Jboot 应用中,可以通过几下几种方式给 Jboot 应用进行配置。

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

注意:如果同一个属性被多处配置,那么 Jboot 读取配置的优先顺序是: 分布式配置中心 > 启动参数 > Jvm 系统属性 > 环境变量 > jboot.properties 配置

读取配置

  1. String host = Jboot.configValue("undertow.host")
  2. String port = Jboot.configValue("undertow.port")

注入配置

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

或者

  1. @RPCBean(group="myGroup",version="myVersion",port=...)
  2. public class UserServiceProvider extends UserService{
  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 应用中,注解的值可以通过 ${key} 的方式,读取到配置内容的 key 对于的 value 值。

配置实体类

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

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

备注:@ConfigModel(prefix="component1") 注解的含义是 Component1Config 的前缀是 component1 ,因此,其属性 host 是来至配置文件的 component1.host 的值。

开启 Nacos 分布式配置中心

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

  1. <dependency>
  2. <groupId>com.alibaba.nacos</groupId>
  3. <artifactId>nacos-client</artifactId>
  4. <version>1.3.2</version>
  5. </dependency>

第二步:启动 nacos

如何启动 nacos 的相关文档在

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

或者

https://nacos.io/zh-cn/docs/quick-start-docker.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 分布式配置中心

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

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

第二步,启动 Apollo

相关文档在 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. }

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

  1. public MyConfigDecriptor implements JbootConfigDecryptor {
  2. public String decrypt(String key, String originalContent){
  3. //在这里实现你自己的解密算法
  4. //key : 很多时候我们并不是针对所有的配置都进行加密,只是加密了个别配置
  5. //此时,我们可以通过 key 来判断那些无需加密的内容,不需要加密直接返回 originalContent 即可
  6. }
  7. }

设计原因

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

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

常见问题

1、如何设置启动参数 ?

答:在 fatjar 模式下,可以通过添加 --(两个中划线) 来指定配置,例如:java -jar —undertow.port=8080 —undertow.host=0.0.0.0

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

答:和启动参数一样,只需要把 -- 换成 -D,例如: java -jar -Dundertow.port=8080 -Dundertow.host=0.0.0.0

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

答:在 Docker 下,启动 Docker 容器的时候,只需要添加 -e 参数即可,例如: docker run -e undertow.port=8080 xxxx Linux、Window、Mac 搜索引擎自行搜索关键字: 环境变量配置

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

RPC 配置

参考 这里

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.host
  93. jboot.mq.rabbitmq.port
  94. jboot.mq.rabbitmq.virtualHost
  95. jboot.mq.qpid.host
  96. jboot.mq.qpid.username
  97. jboot.mq.qpid.password
  98. jboot.mq.qpid.virtualHost
  99. jboot.mq.aliyun.accessKey
  100. jboot.mq.aliyun.secretKey
  101. jboot.mq.aliyun.addr
  102. jboot.mq.aliyun.producerId
  103. jboot.mq.aliyun.sendMsgTimeoutMillis
  104. jboot.mq.zbus.queue
  105. jboot.mq.zbus.broker
  106. jboot.cache.type
  107. jboot.cache.ehcache.configFileName
  108. jboot.cache.redis.host
  109. jboot.cache.redis.port
  110. jboot.cache.redis.password
  111. jboot.cache.redis.database
  112. jboot.cache.redis.timeout
  113. jboot.cache.redis.clientName
  114. jboot.cache.redis.testOnCreate
  115. jboot.cache.redis.testOnBorrow
  116. jboot.cache.redis.testOnReturn
  117. jboot.cache.redis.testWhileIdle
  118. jboot.cache.redis.minEvictableIdleTimeMillis
  119. jboot.cache.redis.timeBetweenEvictionRunsMillis
  120. jboot.cache.redis.numTestsPerEvictionRun
  121. jboot.cache.redis.maxAttempts
  122. jboot.cache.redis.maxTotal
  123. jboot.cache.redis.maxIdle
  124. jboot.cache.redis.maxWaitMillis
  125. jboot.cache.redis.serializer
  126. jboot.cache.redis.type
  127. jboot.schedule.cron4jFile
  128. jboot.schedule.poolSize
  129. jboot.model.scan
  130. jboot.model.columnCreated
  131. jboot.model.columnModified
  132. jboot.model.idCacheEnable
  133. jboot.model.idCacheType
  134. jboot.model.idCacheTime
  135. jboot.metric.url
  136. jboot.metric.reporter
  137. jboot.metric.reporter.cvr.path
  138. jboot.metric.reporter.graphite.host
  139. jboot.metric.reporter.graphite.port
  140. jboot.metric.reporter.graphite.prefixedWith
  141. jboot.wechat.debug
  142. jboot.wechat.appId
  143. jboot.wechat.appSecret
  144. jboot.wechat.token
  145. jboot.wechat.partner
  146. jboot.wechat.paternerKey
  147. jboot.wechat.cert
  148. jboot.shiro.loginUrl
  149. jboot.shiro.successUrl
  150. jboot.shiro.unauthorizedUrl
  151. jboot.shiro.ini
  152. jboot.shiro.urlMapping
  153. jboot.shiro.invokeListener
  154. jboot.serializer.type
  155. jboot.swagger.path
  156. jboot.swagger.title
  157. jboot.swagger.description
  158. jboot.swagger.version
  159. jboot.swagger.termsOfService
  160. jboot.swagger.host
  161. jboot.swagger.contactName
  162. jboot.swagger.contactEmail
  163. jboot.swagger.contactUrl
  164. jboot.swagger.licenseName
  165. jboot.swagger.licenseUrl
  166. jboot.http.type
  167. jboot.redis.host
  168. jboot.redis.port
  169. jboot.redis.password
  170. jboot.redis.database
  171. jboot.redis.timeout
  172. jboot.redis.clientName
  173. jboot.redis.testOnCreate
  174. jboot.redis.testOnBorrow
  175. jboot.redis.testOnReturn
  176. jboot.redis.testWhileIdle
  177. jboot.redis.minEvictableIdleTimeMillis
  178. jboot.redis.timeBetweenEvictionRunsMillis
  179. jboot.redis.numTestsPerEvictionRun
  180. jboot.redis.maxAttempts
  181. jboot.redis.maxTotal
  182. jboot.redis.maxIdle
  183. jboot.redis.maxWaitMillis
  184. jboot.redis.serializer
  185. jboot.redis.type
  186. jboot.limit.enable
  187. jboot.limit.rule
  188. jboot.limit.fallbackProcesser
  189. jboot.limit.defaultHttpCode
  190. jboot.limit.defaultAjaxContent
  191. jboot.limit.defaultHtmlView