Spring Cloud微服务下如何配置I8n
什么是I8n
国际化(I18n
)指的是设计和开发产品的过程,使得它们能够适应多种语言和文化环境,而不需要进行大量的代码更改。这通常涉及到创建一个基础版本的产品,然后通过配置和资源文件来添加对不同语言和地区的支持。
这样,当产品需要在新的地理区域或语言环境中使用时,只需要添加或更新相应的资源文件,而不需要修改产品本身的代码。
❝
"
I18n
" 是 "Internationalization
" 的缩写形式,之所以是 "I18n
" 而不是 "Int
" 或者其他缩写,是因为 "Internationalization
" 这个词的第一个字母是 "I
",最后一个字母是 "n
",而在这两个字母之间有 18 个字符。因此,"I18n
" 成为了一个流行的缩写方式,类似的还有 "K8s
" 。❞
Spring Boot I18n
I8n
体现在Java
后端比较常见的就是错误提示,而SpringBoot
本身就提供了对I8n的支持。使用也非常简单,可以参考一下官方文档。
添加国际化资源文件
SpringBoot
默认会读取classpath/resource
下的messages
目录里的国际化资源文件,可以通过下面这个配置更改:
spring.messages.basename=messages
咱们先通过Idea
创建国际化资源文件,方法如下:
创建完成后在reources
目录下能看到这些国际化资源文件,图中为了演示,定义了咱们开发中比较常见的登录错误提示信息。
创建工具类
创建工具类的目的是方便咱们获取国际化信息
public class I18nUtil {
public static String getI18nMessage(String code) {
try {
// SpringBoot提供有一个MessageSource的默认实现
MessageSource messageSource = SpringUtils.getBean("messageSource");
// 从SpringBoot中获取请求上下文 语言
Locale locale = LocaleContextHolder.getLocale();
// 因为我项目只有中文和英文,所以判断一下除了指定中文,否则默认使用英文
// 这里对简体中文的定义,Locale[] SIMPLIFIED_CHINESE = {Locale.CHINESE, Locale.CHINA, Locale.SIMPLIFIED_CHINESE, Locale.PRC};
if (Arrays.stream(LocaleUtils.SIMPLIFIED_CHINESE).toList().contains(locale)) {
locale = Locale.SIMPLIFIED_CHINESE;
} else {
locale = Locale.US;
}
return messageSource.getMessage(code, null, locale);
} catch (Exception e) {
log.error("获取国际化内容异常", e);
// 如果获取国际化信息失败就返回原内容
return code;
}
}
}
定义接口统一返回类
@Data
public class RestResult<T> implements Serializable {
private static final long serialVersionUID = 1L;
/** 状态标识码 */
private String code;
/** 描述信息 */
private String message;
/** 数据 */
private T data;
public String getMessage(){
if (StrUtil.isNotEmpty(this.code)) {
// 获取I8n
return I18nUtil.getI18nMessage(this.code)
}
return this.message;
}
// 省略其他方法。。。
}
请求头添加语言编码
curl -H "Accept-Language: zh-CN" http://example.com
Spring Cloud 配置I8n
上面是一个简单的是SpringBoot
项目配置I8n的流程,但是在Spring Cloud
下通常会有多个服务(SpringBoot
项目)。按照我们的习惯一般有一个公共项目(common
),用于封装POJO
和一些通用的工具类、常量类之类的功能,然后把这个项目打成jar
包,其他业务服务都会依赖这个项目,达到功能复用的目的。通用我们也会将一些通用的错误信息(比如:用户Id不能为空)放到common
项目里面,那么怎么把这些通用错误信息配置成I8n
呢?
❝
按照上面所说,我们把
common
项目打成jar
包供其他业务服务使用,那么当其他服务引入common
依赖以后,common
就和业务服务同处于一个Spring
容器,这时候上面的I8n
配置就无法读取到common
里面的I8n
配置了(上面讲过了SpringBoot
默认读取的是项目classpath/resource
下的配置文件)。因此我们需要自定义一个MessageSource
然后读取common
下的I8n
配置就可以了。❞
首先,我们在 common
的resource
下创建I8n
配置文件,方法和上面一样,因为和业务服务同处一个Spring
容器,所以我们需要将资源名称区分开,我们暂且就叫common_messages
, 如下图所示:
然后,我们配置一个自定义 MessageSource
Bean
,并且读取我们设置的common_messages
@Bean(name = "commonMessageSource")
public ResourceBundleMessageSource resourceBundleMessageSource() throws IOException {
ResourceBundleMessageSource source = new ResourceBundleMessageSource();
source.setDefaultEncoding(StandardCharsets.UTF_8.displayName());
source.setBasename("common_messages");
return source;
}
最后,调整 I8nUtil
逻辑,先读取业务服务自己的I8n
,如果没有再从common
I8n
获取,如果还没有则返回原code
public class I18nUtil {
public static String getI18nMessage(String code) {
try {
// SpringBoot提供有一个MessageSource的默认实现
MessageSource messageSource = SpringUtils.getBean("messageSource");
// 从SpringBoot中获取请求上下文 语言
Locale locale = LocaleContextHolder.getLocale();
// 因为我项目只有中文和英文,所以判断一下除了指定中文,否则默认使用英文
// 这里对简体中文的定义,Locale[] SIMPLIFIED_CHINESE = {Locale.CHINESE, Locale.CHINA, Locale.SIMPLIFIED_CHINESE, Locale.PRC};
if (Arrays.stream(LocaleUtils.SIMPLIFIED_CHINESE).toList().contains(locale)) {
locale = Locale.SIMPLIFIED_CHINESE;
} else {
locale = Locale.US;
}
try{
// 先读取业务服务自己配置的I8n
return messageSource.getMessage(code, null, locale);
}catch (NoSuchMessageException e) {
// 如果没有获取到,再从common里面读取I18n
ResourceBundleMessageSource commonMessageSource = SpringUtils.getBean("commonMessageSource");
return commonMessageSource.getMessage(code, null, locale);
}
} catch (Exception e) {
log.error("获取国际化内容异常", e);
// 如果获取国际化信息失败就返回原内容
return code;
}
}
}
本文使用 markdown.com.cn 排版
Spring Cloud微服务下如何配置I8n的更多相关文章
- Spring Cloud微服务下的权限架构调研
随着微服务架构的流行,系统架构调整,项目权限系统模块开发提上日程,需要对权限架构进行设计以及技术选型.所以这段时间看了下相关的资料,做了几个对比选择. 一.架构图 初步设想的架构如下,结构很简单:eu ...
- spring cloud微服务下手动回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 这里使用的场景是,跨服务调用接口,比如:用户信息和用户积分 ...
- Spring Cloud微服务Sentinel+Apollo限流、熔断实战总结
在Spring Cloud微服务体系中,由于限流熔断组件Hystrix开源版本不在维护,因此国内不少有类似需求的公司已经将眼光转向阿里开源的Sentinel框架.而以下要介绍的正是作者最近两个月的真实 ...
- Spring Cloud微服务限流之Sentinel+Apollo生产实践
Sentinel概述 在基于Spring Cloud构建的微服务体系中,服务之间的调用链路会随着系统的演进变得越来越长,这无疑会增加了整个系统的不可靠因素.在并发流量比较高的情况下,由于网络调用之间存 ...
- Servlet+MyBatis项目转Spring Cloud微服务,多数据源配置修改建议
一.项目需求 在开发过程中,由于技术的不断迭代,为了提高开发效率,需要对原有项目的架构做出相应的调整. 二.存在的问题 为了不影响项目进度,架构调整初期只是把项目做了简单的maven管理,引入spri ...
- Spring Cloud微服务系列文,服务调用框架Feign
之前博文的案例中,我们是通过RestTemplate来调用服务,而Feign框架则在此基础上做了一层封装,比如,可以通过注解等方式来绑定参数,或者以声明的方式来指定请求返回类型是JSON. 这种 ...
- 一张图了解Spring Cloud微服务架构
Spring Cloud作为当下主流的微服务框架,可以让我们更简单快捷地实现微服务架构.Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟.经得起实际考验的服务框架组合起来 ...
- 如何优化Spring Cloud微服务注册中心架构?
作者: 石杉的架构笔记 1.再回顾:什么是服务注册中心? 先回顾一下什么叫做服务注册中心? 顾名思义,假设你有一个分布式系统,里面包含了多个服务,部署在不同的机器上,然后这些不同机器上的服务之间要互相 ...
- Dubbo和Spring Cloud微服务架构比较
Dubbo 出生于阿里系,是阿里巴巴服务化治理的核心框架,并被广泛应用于中国各互联网公司:只需要通过 Spring 配置的方式即可完成服务化,对于应用无入侵,设计的目的还是服务于自身的业务为主. 微服 ...
- Dubbo 和 Spring Cloud微服务架构 比较及相关差异
你真的了解微服务架构吗?听听八年阿里架构师怎样讲述Dubbo和Spring Cloud微服务架构. 微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务, ...
随机推荐
- C语言:汉诺塔问题(Hanoi Tower)------递归算法
汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆 ...
- 用 C 语言开发一门编程语言 — 字符串与文件加载
目录 文章目录 目录 前文列表 字符串 读取字符串 注释 文件加载函数 命令行参数 打印函数 报错函数 源代码 前文列表 <用 C 语言开发一门编程语言 - 交互式解析器> <用 C ...
- MyBatis延迟加载策略详解
延迟加载就是在需要用到数据的时候才进行加载,不需要用到数据的时候就不加载数据.延迟加载也称为懒加载. 优点:在使用关联对象时,才从数据库中查询关联数据,大大降低数据库不必要开销. 缺点:因为只有当需要 ...
- PaddleOCR在 windows下的webAPI部署方案
很多小伙伴在使用OCR时都希望能过采用API的方式调用,这样就可以跨端跨平台了.本文将介绍一种基于python的PaddleOCR识方案.喜欢的可以关注公众号,获取更多内容. # 一. windows ...
- 在Rainbond上部署高可用Apollo集群
一.背景信息 当前文档描述如何通过云原生应用管理平台 Rainbond 一键安装高可用 Apollo 集群.这种方式适合给不太了解 Kubernetes.容器化等复杂技术的用户使用,降低了在 Kube ...
- Kubernetes1.16安装[kubadm方式]
Kubernetes 安装手册(非高可用版) 集群信息 1. 节点规划 部署k8s集群的节点按照用途可以划分为如下2类角色: master:集群的master节点,集群的初始化节点,基础配置不低于2C ...
- FreeRTOS例程开发
环境配置 下载官方源码 https://www.freertos.org/ 找到这个,他就是visual studio示例demo,我们主要在这个的基础上修改 下载visio studio https ...
- 8.13考试总结(NOIP模拟38)[a·b·c]
重要的不是你做了多少事,而是你放了多少心思进去. T1 a 解题思路 总结一下,是双指针运用不够熟练(zxb笑了笑). 其实这个题是可以用树状数组卡过的(众所周知我是一个正直的人),但是一定是要打正解 ...
- 7.11考试总结(NOIP模拟11)[math·biology·english]
吾于冥河沉浮,受尽命运捉弄,纵然汝将忘吾,吾亦伴汝身旁. 前言 考试的时候本来一看 T2 一见如故,决定 231 开题,然后瞅了一眼 T3 的题面,似曾相识. 仔细看了一眼,这,这不是差异吗,然后果断 ...
- 开源一站式敏捷测试管理,极简项目管理平台 itest(爱测试) 6.6.2 发布,便捷迫切功能增强
(一)itest 简介及更新说明 itest 开源敏捷测试管理,testOps 践行者,极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试5合1,又有丰富的统计分析.可按测试包分配测试用例执行 ...