美文网首页
阿里云docker容器部署spring boot项目 加载外部文

阿里云docker容器部署spring boot项目 加载外部文

作者: 海染蓝了天_2d47 | 来源:发表于2023-02-12 16:55 被阅读0次

    首先 spring boot项目默认搭的是jar,这时候jar和以前web 项目的war包部署在加载外部资源文件还是有点区别的

    1.首先把需要加载的文件放在服务器某一个文件夹里:比如 /opt/config

    对应的配置文件


    image.png

    系统里面加载的配置文件类

    import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder;
    import com.wechat.pay.contrib.apache.httpclient.auth.PrivateKeySigner;
    import com.wechat.pay.contrib.apache.httpclient.auth.ScheduledUpdateCertificatesVerifier;
    import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Credentials;
    import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Validator;
    import com.wechat.pay.contrib.apache.httpclient.util.PemUtil;
    import lombok.Data;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.PropertySource;
    import org.springframework.core.io.ClassPathResource;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.UnsupportedEncodingException;
    import java.nio.charset.StandardCharsets;
    import java.security.PrivateKey;
    
    
    @Configuration
    @PropertySource("classpath:wxpay.properties") //读取配置文件
    @ConfigurationProperties(prefix = "wxpay") //读取wxpay节点
    @Data //使用set方法将wxpay节点中的值填充到当前类的属性中
    @Slf4j
    public class WxPayConfig {
        // private String url =new ClassPathResource("wxxcqpay_key.pem").getPath();
        // private String url = WxPayConfig.class.getResource("/apiclient_key.pem").getPath();
        /**
         * 阿里云 加载资源
         */
        //  public ClassPathResource classPathResource = new ClassPathResource("/opt/upload/apiclient_key.pem");
    
        /**
         * 本地环境 加载资源
         */
        //private String filePath = WxPayConfig.class.getResource("/apiclient_key.pem").getPath();
        //private String filePath = WxPayConfig.class.getResource("/opt/upload/wxxcqpay_key.pem").getPath();
     //   private String url = new ClassPathResource("/wxxcqpay_key.pem").getPath();
        // 商户号
        private String mchId;
    
        private String secret;
    
        // 商户API证书序列号
        private String mchSerialNo;
    
        // 商户私钥文件
        public String privateKeyPath;
    
        // APIv3密钥
        private String apiV3Key;
    
        // APPID
        private String appid;
    
        // 微信服务器地址
        private String domain;
    
        // 接收结果通知地址
        private String notifyDomain;
    
        //    // APIv2密钥
        private String partnerKey;
        /**
         * 获取商户的私钥文件
         *
         * @param filename
         * @return getPartnerKey
         */
        public PrivateKey getPrivateKey(String filename) {
            log.info("filename-------->{}", filename);
            log.info("url-------->{}", url);
            try {
                return PemUtil.loadPrivateKey(new FileInputStream(filename));
            } catch (FileNotFoundException e) {
                throw new RuntimeException("私钥文件不存在1", e);
            }
        }
        /**
         * 获取签名验证器
         *
         * @return
         * @throws UnsupportedEncodingException
         */
        @Bean
        public ScheduledUpdateCertificatesVerifier getVerifier() throws UnsupportedEncodingException {
            log.info("获取签名验证器---");
            // 阿里云环境
    //        ApplicationHome applicationHome = new ApplicationHome(WxPayConfig.class);
    //        String s = applicationHome.getSource().getParentFile().toString();
    //        String filePath = s + "/apiclient_key.pem";
            //  PrivateKey privateKey = getPrivateKey(URLDecoder.decode(filePath, "utf-8"));
            // PrivateKey privateKey = getPrivateKey(URLDecoder.decode(url, "utf-8"));
            //获取商户私钥
            PrivateKey privateKey = getPrivateKey(privateKeyPath);
            log.info("获取签名验证器", privateKey);
            PrivateKeySigner privateKeySigner = new PrivateKeySigner(mchSerialNo, privateKey);
            WechatPay2Credentials wechatPay2Credentials = new WechatPay2Credentials(mchId, privateKeySigner);
            ScheduledUpdateCertificatesVerifier verifier = new ScheduledUpdateCertificatesVerifier(
                    wechatPay2Credentials,
                    apiV3Key.getBytes(StandardCharsets.UTF_8));
            return verifier;
        }
        /**
         * 获取http请求对象
         *
         * @param verifier
         * @return
         * @throws UnsupportedEncodingException
         */
        @Bean(name = "wxPayClient")
        public CloseableHttpClient getWxPayClient(ScheduledUpdateCertificatesVerifier verifier) throws UnsupportedEncodingException {
            log.info("获取httpClient");
            // 阿里云环境
    //        ApplicationHome applicationHome = new ApplicationHome(WxPayConfig.class);
    //        String s = applicationHome.getSource().getParentFile().toString();
    //        String filePath = s + "/apiclient_key.pem";
    
            //获取商户私钥
            //  PrivateKey privateKey = getPrivateKey(URLDecoder.decode(filePath, "utf-8"));
            //  PrivateKey privateKey = getPrivateKey(URLDecoder.decode(url, "utf-8"));
            //获取商户私钥
            PrivateKey privateKey = getPrivateKey(privateKeyPath);
            WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
                    .withMerchant(mchId, mchSerialNo, privateKey)
                    .withValidator(new WechatPay2Validator(verifier));
            // ... 接下来,你仍然可以通过builder设置各种参数,来配置你的HttpClient
            // 通过WechatPayHttpClientBuilder构造的HttpClient,会自动的处理签名和验签,并进行证书自动更新
            CloseableHttpClient httpClient = builder.build();
            return httpClient;
        }
        /**
         * 获取HttpClient,无需进行应答签名验证,跳过验签的流程
         */
        @Bean(name = "wxPayNoSignClient")
        public CloseableHttpClient getWxPayNoSignClient() throws UnsupportedEncodingException {
    
            //获取商户私钥
    //        PrivateKey privateKey = getPrivateKey(privateKeyPath);
    
            // 阿里云环境
    //        ApplicationHome applicationHome = new ApplicationHome(WxPayConfig.class);
    //        String s = applicationHome.getSource().getParentFile().toString();
    //        String filePath = s + "/apiclient_key.pem";
    
            // PrivateKey privateKey = getPrivateKey(URLDecoder.decode(filePath, "utf-8"));
            //    PrivateKey privateKey = getPrivateKey(URLDecoder.decode(url, "utf-8"));
            //获取商户私钥
            PrivateKey privateKey = getPrivateKey(privateKeyPath);
            //用于构造HttpClient
            WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
                    //设置商户信息
                    .withMerchant(mchId, mchSerialNo, privateKey)
                    //无需进行签名验证、通过withValidator((response) -> true)实现
                    .withValidator((response) -> true);
    
            // 通过WechatPayHttpClientBuilder构造的HttpClient,会自动的处理签名和验签,并进行证书自动更新
            CloseableHttpClient httpClient = builder.build();
    
            log.info("== getWxPayNoSignClient END ==");
    
            return httpClient;
        }
    }
    

    2.编写镜像文件 (最简单的)

    FROM  openjdk:8
    ADD new-authority-system-service-0.0.1-SNAPSHOT.jar /app.jar
    EXPOSE 8082
    ENTRYPOINT ["java","-jar","/app.jar"]
    

    3.将JAR包打成镜像

    docker build -t system-service:0.0.1 .  
    
    image.png

    注意:Dockerfile文件和jar文件在同一个目录下


    image.png

    4.运行镜像文件并进行目录的挂载(资源文件)

     docker run --name system-service -d -p 8082:8082 -v /opt/config:/opt/configsystem-service:0.0.1
    #/opt/config:/opt/config  之前在服务器上存放的资源文件路径(可以自定义,但是要和图一的路径相对应)
    

    完成!

    相关文章

      网友评论

          本文标题:阿里云docker容器部署spring boot项目 加载外部文

          本文链接:https://www.haomeiwen.com/subject/scudkdtx.html