全栈程序猿的成长

【信创一】微服务适配TongWeb及遇到的问题

2023-09-12  本文已影响0人  小尘哥

一、信创要求

当前大环境下,行业内信创大业搞的如火如荼,虽然有“纯自研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 部署包改造

代码是适配改造网上有很多教程,这里我简单说一下大概步骤:

  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>
  1. 修改打包方式,jar改成war
<packaging>war</packaging>
  1. 修改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);  
    }  
}
  1. 修改打包方式,此处注意,添加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
  1. 创建Http通道,用于监听微服务。【web容器配置-HTTP通道管理】


    2.png
  2. 创建虚拟机,配合Http通道,可以创建多个,用于多个微服务【web容器配置-虚拟主机管理】


    3.png
  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通道管理

上一篇下一篇

猜你喜欢

热点阅读