DockerCompose - 微服务项目部署全过程(最佳实践)

2024-01-21

目录

一、微服务项目部署

1.1、项目介绍

1.2、准备 MySQL 初始化文件

1.3、pom.xml 插件

1.4、测试工作

1.5、编写 Dockerflie 文件

1.6、编写 DockerCompose.yml 文件

1.7、修改 application.yml 文件

1.8、打包上传服务器

1.9、微服务,启动!

1.10、测试结果


一、微服务项目部署


1.1、项目介绍

a)技术选型:SpringCloud 2021.0.1 、SpringCloud Alibaba 2021.0.1.0、SpringBoot 2.6.3、Docker & DockerCompose、JDK 17.

b)软件环境:MySQL、Nacos.

c)服务拆分:blog、user、gateway.

d)其他模块:common(公共模块)、OpenFeign.

e)父项目 pom.xml 配置:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.cyk</groupId>
    <artifactId>cloud_blog</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <modules>
        <module>user</module>
        <module>blog</module>
        <module>openfeign</module>
        <module>common</module>
        <module>gateway</module>
    </modules>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <java.version>17</java.version>
        <mybatis-spring-boot.version>2.3.1</mybatis-spring-boot.version>
        <mysql.version>5.1.49</mysql.version>
        <spring-cloud.version>2021.0.1</spring-cloud.version>
        <spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version>
    </properties>

    <!--维护依赖-->
    <dependencyManagement>
        <dependencies>

            <!-- spring-cloud -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- spring-cloud-alibaba -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!--mybatis-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis-spring-boot.version}</version>
            </dependency>

            <!--mysql-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>

            <!--spring-boot-test-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>

            <!--mybatis-test-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter-test</artifactId>
                <version>${mybatis-spring-boot.version}</version>
                <scope>test</scope>
            </dependency>
        </dependencies>

    </dependencyManagement>

</project>

Ps:麻雀虽小,五脏俱全~   如果还有其他中间件(RabbitMQ、ES......)需要部署,如果人不是小傻瓜,都能配出来~

1.2、准备 MySQL 初始化文件

a)当我们把项目部署到云服务上之后,数据库可能是空的,因此强烈建议提前编写好 SQL 文件,之后就可以通过 docker-compose.yml 的 volumes 映射 docker 的 mysql 初始化脚本文件,完成初始化操作.

b)db.sql 文件如下

create database if not exists demo;

use demo;

drop table if exists user;
create table user (
    id bigint primary key auto_increment comment '自增主键id',
    username varchar(20) not null unique comment '用户名',
    password varchar(20) not null comment '密码',
    create_time datetime default now() comment '创建时间',
    update_time datetime default now() comment '修改时间'
);

drop table if exists blog;
create table blog (
    id bigint primary key auto_increment comment '自增主键',
    userId bigint not null comment '用户id',
    title varchar(32) not null comment '标题',
    content varchar(256) not null comment '正文',
    read_count bigint default 0 comment '阅读量',
    create_time datetime default now() comment '创建时间',
    update_time datetime default now() comment '修改时间'
);

insert into user(username, password) values('cyk', '1111');
insert into blog(userId ,title, content) values(1, '今天真开心', '今天真开行啊,我要好好学习,然后晚上出去玩!');

c)docker 根据别名创建目录默认在 /var/lib/docker/volumes/ 中,因此可以在此目录创建一个 mysql-init 文件夹(将来 docker-compose 文件需要挂载的宿主机数据卷),在将 db.sql 文件放入该文件夹中即可.

➜  mysql-init pwd
/var/lib/docker/volumes/mysql-init
➜  mysql-init ll   
总用量 4.0K
-rw-r--r--. 1 root root 1.1K 1月  13 22:23 db.sql
➜  mysql-init cat db.sql 
create database if not exists demo;

use demo;

drop table if exists user;
create table user (
    id bigint primary key auto_increment comment '自增主键id',
    username varchar(20) not null unique comment '用户名',
    password varchar(20) not null comment '密码',
    create_time datetime default now() comment '创建时间',
    update_time datetime default now() comment '修改时间'
);

drop table if exists blog;
create table blog (
    id bigint primary key auto_increment comment '自增主键',
    userId bigint not null comment '用户id',
    title varchar(32) not null comment '标题',
    content varchar(256) not null comment '正文',
    read_count bigint default 0 comment '阅读量',
    create_time datetime default now() comment '创建时间',
    update_time datetime default now() comment '修改时间'
);

insert into user(username, password) values('cyk', '1111');
insert into blog(userId ,title, content) values(1, '今天真开心', '今天真开行啊,我要好好学习,然后晚上出去玩!');

1.3、pom.xml 插件

所有需要运行的微服务 都需要有这个插件(父工程不需要任何插件),否则找不到程序入口,没法编译运行(如下图).

插件如下:

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

1.4、测试工作

强烈建议,先把需要运行的微服务的 jar 包,都在本地通过 java -jar 运行一下,检查是否能运行成功,这是一个好习惯~

1.5、编写 Dockerflie 文件

a)user 微服务

FROM openjdk:17
# 指定容器工作目录为 apps
WORKDIR /apps
EXPOSE 9090
# 将宿主机上的 ./user-1.0-SNAPSHOT.jar 文件拷贝到容器的工作目录下,并改名为 user.jar
COPY ./user-1.0-SNAPSHOT.jar ./user.jar
# --spring.profiles.active=prod 表示按照 application-prod.yml 配置文件加载
ENTRYPOINT ["java", "-jar", "user.jar", "--spring.profiles.active=prod"]

b)blog 微服务

FROM openjdk:17
# 指定容器工作目录为 apps
WORKDIR /apps
# 将宿主机上的 ./blog-1.0-SNAPSHOT.jar 文件拷贝到容器的工作目录下,并改名为 blog.jar
COPY blog-1.0-SNAPSHOT.jar blog.jar
EXPOSE 9091
# --spring.profiles.active=prod 表示按照 application-prod.yml 配置文件加载
ENTRYPOINT ["java", "-jar", "/apps/blog.jar", "--spring.profiles.active=prod"]

c)gateway 微服务

FROM openjdk:17
# 指定容器工作目录为 apps
WORKDIR /apps
# 将宿主机上的 ./gateway-1.0-SNAPSHOT.jar 文件拷贝到容器的工作目录下,并改名为 gateway.jar
COPY ./gateway-1.0-SNAPSHOT.jar ./gateway.jar
EXPOSE 10010
# --spring.profiles.active=prod 表示按照 application-prod.yml 配置文件加载
ENTRYPOINT ["java", "-jar", "gateway.jar", "--spring.profiles.active=prod"]

1.6、编写 DockerCompose.yml 文件

a)强烈建议:学过 DockerCompose 的朋友可能都知道有个配置叫做 "depends_on",可以指定容器的启动顺序,但是并不能指定谁先启动完成!!! 是不稳定的!!!因此强烈建议编写两个 DockerCompose 文件,一个是 docker-compose.env.yml(运行必备环境),另一个是 docker-compose.service.yml(微服务),部署的时候只需要启动 env,完成后再启动 service 即可.

b)docker-compose.env.yml 文件如下:

version: "3"

networks:
  blog_net:

volumes:
  data:
  init:

services:

  nacos:
    image: nacos/nacos-server:1.4.2
    ports:
      - "8848:8848"
    environment:
      - "MODE=standalone"
    restart: always
    networks:
      - blog_net


  mysql:
    image: mysql:5.7
    ports:
      - "3306:3306"
    environment:
      - "MYSQL_ROOT_PASSWORD=1111"
    volumes:
      - /root/cyk/cloud_blog/mysql/data:/var/lib/mysql # 映射数据,防止容器重启丢失数据
      - /root/cyk/cloud_blog/mysql/init:/docker-entrypoint-initdb.d
    restart: always
    networks:
      - blog_net

Ps:docker-retrypoint-initdb.d 是 Docker 官方 MySQL 镜像的目录,用于初始化数据库和表,因此通过映射我们配置好的初始化文件 mysql-init,就可以实现自定义初始化数据库和表.

如果需要执行多个脚本文件(sql 文件)来初始化数据库,可以使用以下方法:

  1. 将 sql 文件以数字开头命名,例如 001_create_table.sql、002_insert_data.sql.
  2. 数字小的优先执行.

c)docker-compose.service.yml 文件如下:

version: "3"


networks:
  blog_net:

services:

  gateway: # 网关
    build:
      context: ./gateway
      dockerfile: Dockerfile
    ports:
      - "10010:10010"
    networks:
      - blog_net

  blog: # 博客服务
    build:
      context: ./blog
      dockerfile: Dockerfile
    ports:
      - "9091:9091"
    networks:
      - blog_net

  user: # 用户服务
    build:
      context: ./user
      dockerfile: Dockerfile
    ports:
      - "9090:9090"
    networks:
      - blog_net

1.7、修改 application.yml 文件

a)强烈建议:提供两个配置文件,一个处理开发环境,另一个处理生产环境(线上环境). 这样本地测试和线上测试就不用老去修改配置文件,关键不小心还容易改错~

b)例如 user 微服务,当前项目需要修改的就是 nacos 和 mysql 连接地址,都修改为 docker-compose 文件中配置的服务Id 名称即可(前提是配置了 networks 在同一网络下):

开发环境如下

server:
  port: 9090

spring:
  application:
    name: user-server
  cloud:
    nacos:
      server-addr: localhost:8848
  datasource:
    url: jdbc:mysql://localhost:3306/demo?characterEncoding=utf8&useSSL=false
    username: root
    password: 1111
    driver-class-name: com.mysql.jdbc.Driver
    # 时间处理
  jackson:
    date-format: yyyy-MM-dd
    time-zone: GMT+8

  # mybatis xml save path
mybatis:
  mapper-locations: classpath:mapper/*Mapper.xml
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

logging:
  pattern:
    dateformat: HH:mm:ss
  level:
    com:
      cyk: debug

生产环境如下

server:
  port: 9090

spring:
  application:
    name: user-server
  cloud:
    nacos:
      server-addr: nacos:8848
  datasource:
    url: jdbc:mysql://mysql:3306/demo?characterEncoding=utf8&useSSL=false
    username: root
    password: 1111
    driver-class-name: com.mysql.jdbc.Driver
    # 时间处理
  jackson:
    date-format: yyyy-MM-dd
    time-zone: GMT+8

  # mybatis xml save path
mybatis:
  mapper-locations: classpath:mapper/*Mapper.xml
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

logging:
  pattern:
    dateformat: HH:mm:ss
  level:
    com:
      cyk: debug

1.8、打包上传服务器

a)强烈建议:打包前先 clean,避免一些不必要的缓存 class 干扰.

b)打包

b)上传时,建议按服务名称分包,因为每个 Dockerfile 构建成镜像时会把所有工作目录下的所有 Dockerfile 文件都加载一遍,因此不要都放一个目录下,而是分开放.

1.9、微服务,启动!

a)先启动 env 环境容器.

➜  cloud_blog docker-compose -f docker-compose.env.yml up -d
[+] Running 24/24
 ⠿ mysql Pulled                                                                                                                            57.7s
   ⠿ 72a69066d2fe Pull complete                                                                                                            31.9s
   ⠿ 93619dbc5b36 Pull complete                                                                                                            31.9s
   ⠿ 99da31dd6142 Pull complete                                                                                                            32.1s
   ⠿ 626033c43d70 Pull complete                                                                                                            32.2s
   ⠿ 37d5d7efb64e Pull complete                                                                                                            32.2s
   ⠿ ac563158d721 Pull complete                                                                                                            36.7s
   ⠿ d2ba16033dad Pull complete                                                                                                            36.7s
   ⠿ 0ceb82207cd7 Pull complete                                                                                                            36.7s
   ⠿ 37f2405cae96 Pull complete                                                                                                            56.7s
   ⠿ e2482e017e53 Pull complete                                                                                                            56.7s
   ⠿ 70deed891d42 Pull complete                                                                                                            56.7s
 ⠿ nacos Pulled                                                                                                                            64.8s
   ⠿ 5ad559c5ae16 Pull complete                                                                                                            23.7s
   ⠿ aa9bf71274b4 Pull complete                                                                                                            23.7s
   ⠿ 039d8b3d6a90 Pull complete                                                                                                            62.4s
   ⠿ c96722e52477 Pull complete                                                                                                            62.8s
   ⠿ 93185cc2628e Pull complete                                                                                                            63.6s
   ⠿ 6ddaf1829637 Pull complete                                                                                                            63.8s
   ⠿ af68d9507f36 Pull complete                                                                                                            63.9s
   ⠿ 2684f86bd7ff Pull complete                                                                                                            63.9s
   ⠿ b3c841104577 Pull complete                                                                                                            63.9s
   ⠿ a0643cc92b59 Pull complete                                                                                                            63.9s
   ⠿ a6a1256662e3 Pull complete                                                                                                            63.9s
[+] Running 5/5
 ⠿ Network cloud_blog_blog_net     Created                                                                                                  0.1s
 ⠿ Volume "cloud_blog_mysqlData"   Created                                                                                                  0.0s
 ⠿ Volume "cloud_blog_mysql-init"  Created                                                                                                  0.0s
 ⠿ Container cloud_blog-mysql-1    Started                                                                                                  1.3s
 ⠿ Container cloud_blog-nacos-1    Started                                                                                                  1.2s

b)启动 service 服务容器

➜  cloud_blog docker-compose -f docker-compose.service.yml up -d
[+] Building 44.8s (18/18) FINISHED                                                                                                              
 => [cloud_blog_user internal] load .dockerignore                                                                                           0.0s
 => => transferring context: 2B                                                                                                             0.0s
 => [cloud_blog_blog internal] load .dockerignore                                                                                           0.0s
 => => transferring context: 2B                                                                                                             0.0s
 => [cloud_blog_gateway internal] load build definition from Dockerfile                                                                     0.0s
 => => transferring dockerfile: 511B                                                                                                        0.0s
 => [cloud_blog_gateway internal] load .dockerignore                                                                                        0.0s
 => => transferring context: 2B                                                                                                             0.0s
 => [cloud_blog_user internal] load build definition from Dockerfile                                                                        0.0s
 => => transferring dockerfile: 491B                                                                                                        0.0s
 => [cloud_blog_blog internal] load build definition from Dockerfile                                                                        0.0s
 => => transferring dockerfile: 499B                                                                                                        0.0s
 => [cloud_blog_blog internal] load metadata for docker.io/library/openjdk:17                                                              16.3s
 => [cloud_blog_blog 1/3] FROM docker.io/library/openjdk:17@sha256:74bad65c9e59d6410bdd67d71a14e14175ddd33d654419ecfabf03ddbe70fff4        27.6s
 => => resolve docker.io/library/openjdk:17@sha256:74bad65c9e59d6410bdd67d71a14e14175ddd33d654419ecfabf03ddbe70fff4                         0.0s
 => => sha256:74bad65c9e59d6410bdd67d71a14e14175ddd33d654419ecfabf03ddbe70fff4 1.29kB / 1.29kB                                              0.0s
 => => sha256:ab43cabb2140ecf2fc1b32b4981ead56960a59e5b64f742ad30ada7e47bb8870 954B / 954B                                                  0.0s
 => => sha256:5f94f53bbced4225dbe770cd98834716ed540315bf131b38a648378c418a6012 4.45kB / 4.45kB                                              0.0s
 => => sha256:155aced2666332ddff5a741b0236f360820e7aa3fc3dde2224fc17a91fc48db6 42.11MB / 42.11MB                                           15.0s
 => => sha256:ac5901c58ecb29b61159b5e3a63dfbb0fb520b2de1d33c9fb038d9b697e3fcd4 13.52MB / 13.52MB                                            7.6s
 => => sha256:6b1076e441ffb58eee60f1bab40db6ca69a01e33346eff212eac1191e6b754bd 187.17MB / 187.17MB                                         23.7s
 => => extracting sha256:155aced2666332ddff5a741b0236f360820e7aa3fc3dde2224fc17a91fc48db6                                                   2.4s
 => => extracting sha256:ac5901c58ecb29b61159b5e3a63dfbb0fb520b2de1d33c9fb038d9b697e3fcd4                                                   0.6s
 => => extracting sha256:6b1076e441ffb58eee60f1bab40db6ca69a01e33346eff212eac1191e6b754bd                                                   3.9s
 => [cloud_blog_gateway internal] load build context                                                                                        1.0s
 => => transferring context: 37.22MB                                                                                                        1.0s
 => [cloud_blog_blog internal] load build context                                                                                           1.1s
 => => transferring context: 42.58MB                                                                                                        1.1s
 => [cloud_blog_user internal] load build context                                                                                           0.9s
 => => transferring context: 42.58MB                                                                                                        0.9s
 => [cloud_blog_gateway 2/3] WORKDIR /apps                                                                                                  0.2s
 => [cloud_blog_blog 3/3] COPY blog-1.0-SNAPSHOT.jar blog.jar                                                                               0.5s
 => [cloud_blog_gateway 3/3] COPY ./gateway-1.0-SNAPSHOT.jar ./gateway.jar                                                                  0.5s
 => [cloud_blog_user 3/3] COPY ./user-1.0-SNAPSHOT.jar ./user.jar                                                                           0.5s
 => [cloud_blog_user] exporting to image                                                                                                    0.1s
 => => exporting layers                                                                                                                     0.1s
 => => writing image sha256:c339d5ec9b3dc9cb81d033b31eafab456e534527923f5df7c479e4e383d19c28                                                0.0s
 => => naming to docker.io/library/cloud_blog_user                                                                                          0.0s
 => [cloud_blog_gateway] exporting to image                                                                                                 0.1s
 => => exporting layers                                                                                                                     0.1s
 => => writing image sha256:b06ecc27be3690c5d345bd042143ca7d72cf1e55f165e46678f92ea2bc39914b                                                0.0s
 => => naming to docker.io/library/cloud_blog_gateway                                                                                       0.0s
 => [cloud_blog_blog] exporting to image                                                                                                    0.1s
 => => exporting layers                                                                                                                     0.1s
 => => writing image sha256:75d36043551d0200ab71694078530806f3b5846e03551f06042771597bb07179                                                0.0s
 => => naming to docker.io/library/cloud_blog_blog                                                                                          0.0s
WARN[0044] Found orphan containers ([cloud_blog-nacos-1 cloud_blog-mysql-1]) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up. 
[+] Running 3/3
 ⠿ Container cloud_blog-blog-1     Started                                                                                                  0.9s
 ⠿ Container cloud_blog-user-1     Started                                                                                                  0.8s
 ⠿ Container cloud_blog-gateway-1  Started                                                                                                  0.8s
➜  cloud_blog docker ps -a                                      
CONTAINER ID   IMAGE                      COMMAND                   CREATED              STATUS              PORTS                                                  NAMES
af78c01da9fd   cloud_blog_user            "java -jar user.jar …"   50 seconds ago       Up 48 seconds       0.0.0.0:9090->9090/tcp, :::9090->9090/tcp              cloud_blog-user-1
9b1e12367d13   cloud_blog_gateway         "java -jar gateway.j…"   50 seconds ago       Up 48 seconds       0.0.0.0:10010->10010/tcp, :::10010->10010/tcp          cloud_blog-gateway-1
74a33d6ecd62   cloud_blog_blog            "java -jar /apps/blo…"   50 seconds ago       Up 48 seconds       0.0.0.0:9091->9091/tcp, :::9091->9091/tcp              cloud_blog-blog-1
32c9be5f7372   nacos/nacos-server:1.4.2   "bin/docker-startup.…"   About a minute ago   Up About a minute   0.0.0.0:8848->8848/tcp, :::8848->8848/tcp              cloud_blog-nacos-1
74830ac95115   mysql:5.7                  "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   cloud_blog-mysql-1

c)注意:如果在此过程中,操作失误了,例如上传了错误的 jar 包,并且还运行过了,但你知道他是错误的,接着你重新上传 jar 包.

此时!!!一定要执行一次 build 命令重新构建!!!否则执行的还是旧的 jar 包(docker 会把执行执行过的容器的镜像保存下载,下次执行会直接通过之前运行过的镜像来运行)

例如是 service 容器中的 jar 重新上传了,那么就执行以下指令重新构建,之后再运行即可.

docker-compose -f docker-compose.service.yml build

1.10、测试结果

通过网关访问以下:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DockerCompose - 微服务项目部署全过程(最佳实践) 的相关文章

  • Java 弱哈希映射 - 需要根据值的弱点而不是键来删除条目

    所以JavaWeakHashMap让我们创建一个映射 如果其键变弱 则删除该映射的条目 但是我怎样才能创建一个Map 当它的条目被删除时values地图上变弱了 我想使用映射的原因是作为全局哈希表 它根据对象的 ID 跟踪对象 ID gt
  • RSA 加密-解密:BadPaddingException:数据必须以零开头

    对于一个被问了很多次的问题 我很抱歉向您询问您的技能 我有一个关于 RSA 加密的问题 我已经检查过有关此问题的其他主题 但没有找到任何有用的答案 我希望你能帮助我 我想读取一个文件 加密其内容 然后解密它并将这些解密的字节放入一个新文件中
  • Selenium - 保存网站,包括所有图像、css、dom

    我想使用 firefox 或 chrome 访问带有 selenium 的页面 当页面加载时 我想从页面下载所有图像 css dom 我想存储每张图像 就像我在其中找到它们一样 chrome gt Tools gt Development
  • Java 中的本机方法

    我花了一些时间学习什么是 Java Native 方法以及它们是在平台相关代码 主要是 C 中实现的 但是我在哪里可以找到这些 Java 的本机实现呢 例如 Thread 类的 sleep long millis 方法是本机的 但它的实现代
  • 将二进制数据的 byte[] 转换为 String

    我有二进制格式的数据 hex 80 3b c8 87 0a 89 我需要将其转换为字符串 以便通过 Jackcess 将二进制数据保存在 MS Access 数据库中 我知道 我不打算在 Java 中使用 String 来存储二进制数据 但
  • 使用netcat将unix套接字传输到tcp套接字

    我正在尝试使用以下命令将 unix 套接字公开为 tcp 套接字 nc lkv 44444 nc Uv var run docker sock 当我尝试访问时localhost 44444 containers json从浏览器中 它不会加
  • 如何将 wsdl 内部架构设置为 Jaxb2Marshaller 以验证我所做的每篇文章?

    我正在使用 SOAP Web 服务 在调用它之前我必须验证每个 xml 帖子 所以我正在使用 The CXF codegen 插件生成POJO树结构 第三部分 wsdl xxxx soap service wsdl 一个类实现Web服务网关
  • Keycloak 社交登录 REST API

    我已经为我的 keycloak 实例启用了谷歌社交登录 但我需要将其用作休息服务 是否有可用于执行此操作的端点 Keycloak 中没有 Google 身份验证 API 但您可以使用以下方法解决它代币交换 https www keycloa
  • 比较和删除列表和数组java中不存在的元素

    我有一个String数组和一List
  • 使用antlr4获取预处理器行并解析C代码

    我正在使用 Antlr4 来解析 C 代码 并使用以下语法来解析 链接到 C g4 https github com antlr grammars v4 blob master c C g4 上面的语法默认不提供任何解析规则来获取预处理器语
  • 如何减少 JSF 中的 javax.faces.ViewState

    减少 JSF 中视图状态隐藏字段大小的最佳方法是什么 我注意到我的视图状态约为 40k 这会在每次请求和响应时下降到客户端并返回到服务器 特别是到达服务器时 这对用户来说会显着减慢 我的环境 JSF 1 2 MyFaces Tomcat T
  • JSP 作为电子邮件模板

    有没有办法发送 MIME 电子邮件 其中电子邮件正文源自 JSP 我需要使用 Javamail 发送一封电子邮件 其中包含一个表格 我认为如果我可以使用 JSP 来完成所有格式设置和布局 将会很方便 在这个线程中 Java 电子邮件模板的建
  • 无法使用docker在Apple Mac芯片M1上启动elasticsearch

    在发布这个问题之前 我浏览了许多链接 例如 Kibana 无法在 Mac M1 上使用 docker 连接到 ElasticSearch https stackoverflow com questions 73160632 kibana c
  • 获取证书链

    我正在 Java 中使用 X509 证书 给定一个证书 是否可以在签名层次结构中找到所有其他证书 直到找到根证书 我有一个证书文件 带有 cer扩展名 我想提取父签名证书 我想继续查找该证书的父证书 直到获得最终的自签名根证书 我已经检查了
  • django_debug_toolbar 和 Docker

    因此 我让 docker 和 Django 在本地工作 首先从 Dockerfile 构建一个映像 然后使用 Fig 获取 postgres 映像 将其链接到基础映像 然后运行本地服务器 除了 django debug toolbar 之外
  • 相当于 C# 中 Java 的“ByteBuffer.putType()”

    我正在尝试通过从 Java 移植代码来格式化 C 中的字节数组 在 Java 中 使用方法 buf putInt value buf putShort buf putDouble 等等 但我不知道如何将其移植到 C 我尝试过 MemoryS
  • 为什么 HttpServletRequest 输入流为空?

    我有这段代码 我从请求输入流读取输入并使用 JacksonMapper 转换为 POJO 它在具有 guice 支持的 jetty 7 容器中运行 Override protected void doPost HttpServletRequ
  • ECS 任务定义是否支持卷映射语法?

    docker compose 规范支持卷映射语法services 例如 version 2 volumes jenkins home external true services jenkins build context args DOC
  • 如何确保超类的子类方法的线程安全?

    我参加了一次面试 并被要求为以下要求设计一个课程 假设我有一个 A 类 它可以有任意数量的子类 即子类 类 A 有一个名为 doSomething 的方法 该方法是同步的 要求是 A 的所有子类都是强制性的重写 doSomething me
  • 如果所有类不在同一个包中,Spring @autowired 不起作用

    我有四个包裹 com spring org Files HomeController java com spring org dao Files SubscriberDao java SubscriberDaoImpl java com s

随机推荐

  • 计算机Java项目|基于SpringBoot个人空间平台的设计与实现

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • chrome浏览器无法在地址栏输入内容搜索问题解决--图文

    关于日常遇到的小问题解决记录一下 1 导航栏录入信息后跳转错误 2 解决办法 默认百度搜索引擎地址错误 百度正确的搜索格式是 http www baidu com s wd s chrome浏览器中百度的搜索格式是 http www bai
  • 2024史上最全Java面试八股文(带全部答案)

    今天要谈的主题是关于求职 求职是在每个技术人员的生涯中都要经历多次 对于我们大部分人而言 在进入自己心仪的公司之前少不了准备工作 有一份全面细致 面试题 将帮助我们减少许多麻烦 在跳槽季来临之前 特地做这个系列的文章 一方面帮助自己巩固下基
  • 面试官:分库分表后如何生成全局ID?

    分库分表后就不能使用自增 ID 来作为表的主键了 因为数据库自增 ID 只适用于单机环境 但如果是分布式环境 是将数据库进行分库 分表或数据库分片等操作时 那么数据库自增 ID 就会生成重复 ID 从而导致业务查询上的问题 所以此时 可以使
  • 详解Java信号量-Semaphore

    第1章 引言 大家好 我是小黑 今天 咱们一起来深入探讨一下Semaphore 在Java中 正确地管理并发是一件既挑战又有趣的事情 当谈到并发控制 大家可能首先想到的是synchronized关键字或者是ReentrantLock 但其实
  • JCMsuite应用:光学环形谐振腔模拟

    本案程演示了环形谐振腔的模拟 这种类型的集成光子器件 例如用作升 降滤波器或在传感应用中 当物质或粒子附着在环上时 通过测量其共振频率的位移来检测 对于集成光子电路中的无源光器件 s矩阵通常是研究的热点 它描述了通过端口 波导进入设备的电磁
  • 【卡尔曼滤波】具有梯度流的一类系统的扩散映射卡尔曼滤波器研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据 文章
  • 第三届能源动力与控制工程国际学术会议(EPECE 2024)

    鹅厂第五周实习周记 中注协公布 全各省会计师事务所TOP5 华子三方 秋招投递华子你需要知道的十件事 兄弟们实习过年什么时候回家呢 评论区的朋友们有找实习的吗 我们的第2个实习生干了4个多月被老师叫回学校了 来过的都说好 C C 软开岗位
  • Eclipse、IntelliJ IDEA、PyCharm

    Eclipse IntelliJ IDEA PyCharm Eclipse IntelliJ IDEA和PyCharm是三种流行的集成开发环境 IDE 每个都有其特性和优点 1 Eclipse Eclipse是一款开源 春招求职 来多益网络
  • 搞懂 三次握手四次挥手

    计算机网络体系结构 在学习TCP 三次握手四次挥手之前 让我们先来看下计算机网络分层 主要分为OSI模型和TCP IP模型 OSI模型比较复杂且学术化 所以我们实际使用的TCP IP模型 以连接Mysql服务器为例理解这五层 应用层 应用层
  • 「优选算法刷题」:移动零

    嗨 这个假期罗根开始接触了算法 在为今年的蓝桥杯做准备 所以 开个新专栏 记录记录自己做算法题时的心得 一 题目 给定一个数组 nums 编写一个函数将所有 0 移动到数组的末尾 同时保持非零元素的相对顺序 请注意 必须在不复制数组的情况下
  • 「优选算法刷题」:快乐数

    一 题目 编写一个算法来判断一个数 n 是不是快乐数 快乐数 定义为 对于一个正整数 每一次将该数替换为它每个位置上的数字的平方和 然后重复这个过程直到这个数变为 1 也可能是 无限循环 但始终变不到 1 如果这个过程 结果为 1 那么这个
  • 【固定翼飞行器】用于计算固定翼飞机空气动力学的紧凑涡旋格方法研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 题解 | #获取员工其当前的薪水比其manager#

    我为什么拒了华为 offer 国家智能设计与数控技术创新中心 英语好技术烂的top2工科硕就业迷茫 坐等消息 华为ICT无线网络产品线面经 已完结 华为面经 ICT计算产品线 华为计算产品线实习面试 通软 凉凉 软开还是run开 国企银行的
  • 【自适应滤波】一种接近最佳的自适应滤波器,用于突发系统变化研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 从决策流到数据洞察:JVS规则引擎与智能BI的1.16更新详

    美团到店前端日常实习面经 4 信息安全学习 渗透测试知识点 汽车领域中软件技术方向就业分析 1 整车厂 华为海思光芯片2021校招笔经面经 许愿一个offer 6 中信银行总行大数据中心背调bg统计 春招背水一战 一定要尽快行动起来 华为开
  • 详解toLowerCase(判断字符串相等)

    一 toLowerCase 函数简介 toLowerCase 是一个在多个编程语言中都存在的字符串方法 它的作用是将字符串中的所有大写字母转换为对应的小写字母 常用于文本处理 搜索和比较等情况 以确保字符串的一致性和非大小写敏感的操作 二
  • 题解 | #网易云音乐推荐(网易校招笔试真题)#

    题解 人民币转换 import syss input split mp 1 壹 2 贰 3 叁 4 肆 5 伍 6 陆 蔚来 AI数据库开发实习一面1 11 1 自我介绍2 科大讯飞比赛做了什么 是用到了讯飞平台的某些功能吗3 API开放平
  • 微信公众号AI爆文项目入门

    今日 尝试了进行AI爆文的项目 其核心逻辑是不依赖于传统的打造个人IP 而是使用ChatGPT 文心一言等大语言模型进行创作 并发表到微信公众号平台 实现低粉爆文的效果 通过系统流量池的推荐来实现收益 一篇10W 的文章的收益在800到几千
  • DockerCompose - 微服务项目部署全过程(最佳实践)

    目录 一 微服务项目部署 1 1 项目介绍 1 2 准备 MySQL 初始化文件 1 3 pom xml 插件 1 4 测试工作 1 5 编写 Dockerflie 文件 1 6 编写 DockerCompose yml 文件 1 7 修改