一、信创要求
当前大环境下,行业内信创大业搞的如火如荼,虽然有“纯自研IDE”的搞笑,但是不耽误整个趋势,作为技术人员,那就跟随技术的浪潮往前继续“浪”吧。
项目技术框架采用Spring Cloud + Spring Boot +Nacos +Redis + Mysql,主要使用了这些,经过评估,计划做以下国产化产品适配。
环境类型 | 目前环境 | 目标环境 | 代码改造 |
---|---|---|---|
操作系统 | centos7 | 银河麒麟V10 | 否 |
代理 | Nginx | TongHttpServer6 | 否 |
数据库 | mysql8.0 | 达梦8 | 较多 |
网关 | spring cloud gateway | apache ShenYu | 中等 |
web容器 | tomcat(springboot内嵌) | TongWeb7 | 较少 |
缓存 | redis | TongRDS | 较少 |
jdk | jdk1.8 | Kona(openjdk) | 否 |
注册(配置)中心 | nacos | nacos | - |
根据以上分析(个人经验,欢迎做过信创的道友指正),无代码改造的主要是外部运行环境或代理,对代码无侵入,因此暂且不动。有代码改造的一步一步来,先挑软柿子捏捏--适配web容器TongWeb
二、适配TongWeb
2.1 部署包改造
代码是适配改造网上有很多教程,这里我简单说一下大概步骤:
- 移除原tomcat依赖(有传说不移除也可以,为避免出现神奇错误,建议移除),有可能引用了其他依赖导致tomcat移除不干净,可以使用maven分析工具,具体排查哪里仍旧有tomcat相关引擎,最后检查办法:打开war包搜索tomcat,搜不到即可。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-el</artifactId>
</exclusion>
</exclusions>
</dependency>
- 修改打包方式,jar改成war
<packaging>war</packaging>
- 修改SpringBoot的启动类
@SpringBootApplication
public class SystemApplication extends SpringBootServletInitializer
{
public static void main(String[] args)
{
SpringApplication.run(SystemApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(SystemApplication.class);
}
}
- 修改打包方式,此处注意,添加maven-war-plugin来解决缺少web.xml的报错。有其他两种解决办法:
①添加WEB-INF/web.xml;
②添加配置<failOnMissingWebXml>false</failOnMissingWebXml>
<plugins>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
此时执行maven install,会在项目target目录下得到最终的部署包:system.war
2.2 TongWeb部署应用
TongWeb是东方通提供的web容器,类似weblogic,有web管理界面,需授权后使用,可官网联系商务进行试用申请,管理界面如下
image.png
-
创建Http通道,用于监听微服务。【web容器配置-HTTP通道管理】
2.png -
创建虚拟机,配合Http通道,可以创建多个,用于多个微服务【web容器配置-虚拟主机管理】
3.png -
应用部署【应用管理】:上传部署包、配置基本属性、完成、启动服务即可
部署包上传.png
至此,若不出意外的话要出意外了,服务已成功启动,查看nacos中的服务列表,发现服务未注册上,请继续往下看。
三、常见问题
3.1 服务未注册到nacos
解决:添加nacos注册配置类(网上很多这种方法,亲测可用)
@Component
public class NacosConfig implements ApplicationRunner {
@Autowired(required = false)
private NacosAutoServiceRegistration registration;
@Value("${server.port}")
Integer port;
@Override
public void run(ApplicationArguments args) {
if (registration != null && port != null) {
Integer tomcatPort = port;
try {
tomcatPort = new Integer(getTomcatPort());
} catch (Exception e) {
e.printStackTrace();
}
registration.setPort(tomcatPort);
registration.start();
}
}
/**
* 获取外部tomcat端口
*/
public String getTomcatPort() throws Exception {
MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer();
Set<ObjectName> objectNames = beanServer.queryNames(new ObjectName("*:type=Connector,*"), Query.match(Query.attr("protocol"), Query.value("HTTP/1.1")));
String port = objectNames.iterator().next().getKeyProperty("port");
return port;
}
}
3.2 服务注册成功,但是通过gateway请求不到
解决:请注意上面应用部署章节图中“应用前缀”,因为一般gateway配置如下,会截取请求路径中第一个前缀,因此应用前缀建议配置成"/",否则请求会是404,否则就修改gateway中的predicates,或者filters不截取。
# 系统模块
- id: system
uri: lb://system
predicates:
- Path=/system/**
filters:
- StripPrefix=1
3.3 其他小问题
TongWeb日志查看:安装目录下/logs/{应用名}/error.log
HTTP连接数、超时配置:Http通道管理
网友评论