精华内容
下载资源
问答
  • 微服务项目部署

    2019-02-25 17:27:27
    微服务项目部署
  • 微服务项目-源码

    2021-02-09 19:54:56
    微服务项目
  • 微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目...
  • 资源名称:一步一步学Spring Boot 2微服务项目实战资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
  • SpringCloud微服务项目

    2019-01-21 16:33:51
    一个由SpringCoud微服务架构的小项目,应用了SpringCloud的常见组件,配有项目的SQL文件,导入Eclipse下载好依赖即可使用。在浏览器中访问后台登录界面 http://localhost:8110/manage-web/login。前台展示界面的访问...
  • 利用springcloud组建的微服务架构demo,所用技术eureka/zuul/feign/ribbon/turbin/config-server等技术
  • 相关博客地址:https://www.cnblogs.com/zhangjinru123/p/10241710.html仅用学习使用,不可用于商业用途,如有版权问题,请联系删除!
  • 微服务项目学成在线

    2019-05-17 11:41:28
    微服务项目学成在线,黑马2019年最新项目.开发工具采用的是idea,学习本项目相信大家可以学到很多.
  • spring cloud微服务项目

    2017-08-21 09:19:00
    比较完美实例 微服务项目
  • 古里马尔 一个商城微服务项目
  • 使用idea创建的微服务架构,用于解决负载均衡,高并发等
  • SpringCloud学习笔记(十一)微服务项目结构搭建 代码包,只使用于本章,仅供参考。
  • 乐优商城的英文一个全品类的电商购物网站(B2C)。 用户可以在线购买商品,加入购物车,下单,商品秒杀 可以品论已社群中心商品 管理员可以在后台管理商品的上下游架,活动促销 管理员可以监控点商品销售状况 客服...
  • 一步一步学Spring Boot 2微服务项目实战.rar .
  • 乐优商城的英文一个全品类的电商购物网站(B2C)。 用户可以在线购买商品,加入购物车,下单,商品秒杀 可以品论已社群中心商品 管理员可以在后台管理商品的上下游架,活动促销 管理员可以监控点商品销售状况 ...
  • 2020微服务项目实战

    2020-08-28 11:16:58
    最新升级-全套版-基础+高级+高可用集群,全套学习,一起学微服务实战!
  • 搭建微服务项目.doc

    2020-03-13 15:29:51
    搭建微服务项目(eureka、Feign、公共模块),搭建eureka、服务消费者、服务提供者、基础框架
  • Java 开发的电商微服务项目。 前后分离,前端vue,后端dubbo微服务, 使用技术有* Spring Boot 2.x * Maven构建项目 * Jenkins持续集成 * Dubbo RPC框架 * Apollo统一配置中心 * Spring + Spring MVC + MyBatis SSM...
  • 本资源为RESTFUL文章中所提到的资源文件,为DEMO的项目源码。具有完整的项目结构,包括pom.xml、application.yml配置实例等,是作为一个入门程序的DEMO。
  • 权限管理和配置开发人员,微服务SpringCloud版本开发人员课程概述微服务SpringCloud前后端分离Vue企业项目实战,微服务脚手架,具有统一授权、认证后台管理系统;SpringCloud+Nacos+?SpringBoot+OAuth2+Jwt+Swagger...
  • 地点:微服务项目
  • SpringBoot:微服务项目
  • 微服务项目开发模板 本项目旨在用spring cloud微服务架构,提供快速构建开发环境模板,以及知识点讲解; 主要涉及组件 Eureka 服务注册与发现 Zuul 服务网关 Config 分布式配置 Oauth2 鉴权服务 Zipkin 分布式服务...
  • #microservices
  • 基于springcloud微服务进行实战说明,将构建一个在Docker Compose上运行的注册中心、配置中心、网关服务三个服务(三个容器),以此掌握docker Compose的基本使用。
  • 而在微服务项目中直接添加.groovy文件,存在热点引用不可用问题,即代码中添加一个对象时,编译器不认识则在对象下面画一条横线,而当鼠标移到这个对象时,弹不出可引用包的列表。本文论述了解决这个问题的技巧。
  • SpringBoot+nacos+websocket+redis+mysql+oracle+swagger2+mybatis-plus
  • 微服务项目的部署

    万次阅读 多人点赞 2019-06-18 08:02:54
    掌握微服务项目与Docker的整合方式 掌握微服务项目的部署方式 项目整合参考:https://blog.csdn.net/qq_37823605/article/details/91379272 练习内容 1、Docker Compose编排工具 1.1、Docker Compose的安装与...

    练习目标

    • 掌握Docker Compose编排工具的使用
    • 掌握微服务项目与Docker的整合方式
    • 掌握微服务项目的部署方式

    项目整合参考:https://blog.csdn.net/qq_37823605/article/details/91379272

    练习内容

    1、Docker Compose编排工具

    1.1、Docker Compose的安装与卸载

    1.1.1、安装条件

    Docker Compose是依赖于Docker引擎的,所以在安装Docker Compose之前要确保机器上已经安装了Docker

    1.1.2、安装Compose

    a)、使用curl命令从GitHub的Compose仓库拉取Docker Compose,具体指令如下:

    $sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    

    b)、更改Docker Compose的可执行文件权限,具体操作命令如下:

    $sudo chmod +x /usr/local/bin/docker-compose
    $docker-compose --version

    1.1.3、Compose的卸载操作,命令如下:

    $sudo rm /usr/local/bin/docker-compose

    1.2、Composefile文件的使用说明

    Dooker Compose编排工具的使用非常简单,只需要如下三步。

          (1)编写Dookerfile文件。使用Dockerfile定义应用程序的环境,这样可以在任何地方使用它,Dookefile 的作用就是为每个服务构建镜像。

          (2)定义yml文件(通常是docker- compose.yml)。 就是将前面介绍的服务部署指令及相关参数都统一在该文件中编写和配置,这样就省去了针对不同服务各自运行的麻烦。

          (3)运行服务部署指令。根据具体的部署需求,来执行相应的部署指令,Docker 会读即dooker- composeyml文件内容启动整个应用服务。

          在上述三步中,第一步中Dockerfile文件的编写已经在第7章有过讲解,而第三步的服务部署指令会在后面服务部署环节进行说明,所以现在需要掌握的就是如何编写docker-composeym文件。接下来,将针对Compose file文件的定义和配置进行详细讲解。

          这里先通过一个Compose file 文件的示例来进行展示说明,具体内容如下所示。
     

    version: "3"
    services:
      mysql:
        image: mysql:5.6
        restart: on-failure
        ports:
          - 3306:3306
        volumes:
          - microservice-mysql:/var/lib/mysql
        networks:
          - microservice-net
        environment:
          MYSQL_ROOT_PASSWORD: root
          MYSQL_DATABASE: microservice_mallmanagement
        deploy:
          replicas: 1
          restart_policy:
            condition: on-failure
          placement:
            constraints: [node.role == manager]
    
      eureka-server:
        image: 192.168.159.143:5000/microservice-eureka-server:0.0.1-SNAPSHOT
        restart: on-failure
        ports:
          - 8761:8761
        networks:
          - microservice-net
        deploy:
          replicas: 1
          restart_policy:
            condition: on-failure
    
      gateway-zuul:
        image: 192.168.159.143:5000/microservice-gateway-zuul:0.0.1-SNAPSHOT
        restart: on-failure
        ports:
          - 8050:8050
        networks:
          - microservice-net
        depends_on:
          - eureka-server
        deploy:
          replicas: 1
          restart_policy:
            condition: on-failure
          placement:
            constraints: [node.role == manager]
    
      order-service:
        image: 192.168.159.143:5000/microservice-orderservice:0.0.1-SNAPSHOT
        restart: on-failure
        ports:
          - 7900:7900
        networks:
          - microservice-net
        depends_on:
          - mysql
          - eureka-server
        deploy:
          replicas: 2
          restart_policy:
            condition: on-failure
    
      user-service:
        image: 192.168.159.143:5000/microservice-userservice:0.0.1-SNAPSHOT
        restart: on-failure
        ports:
          - 8030:8030
        networks:
          - microservice-net
        depends_on:
          - mysql
          - eureka-server
        deploy:
          replicas: 2
          restart_policy:
            condition: on-failure
    
      visualizer:
        image: dockersamples/visualizer:stable
        ports:
          - 8081:8080
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
        deploy:
          placement:
            constraints: [node.role == manager]
        networks:
          - microservice-net
    
    networks:
      microservice-net:
    volumes:
      microservice-mysql:
    

    2、微服务于Docker的整合

    2.1、添加Dockerfile文件

          在Docker中,应用都是部署在容器中的,而容器又由镜像生成,镜像则通常是通过Dockerfile文件构建的,所以微服务与Docker整合的第一步就是 要提供Dockerile文件。

          在上一个项目整合中讲解整合时编写的微服务项目microservice- -mallmanagement主要有4个子项目模块(包括2个微服务模块和2个辅助服务模块),我们需要针对每一个子项目模块编写对应的Dockerfile文件。这里以用户订单管理微服务模块为例,所编写的Dockerfile文件的具体内容如下所示。

    FROM java:8-jre
    MAINTAINER shirx <shirx@qq.com>
    
    ADD ./target/microservice-orderservice-0.0.1-SNAPSHOT.jar /app/microservice-orderservice.jar
    CMD ["java", "-Xmx200m", "-jar", "/app/microservice-orderservice.jar"]
    
    EXPOSE 7900

    2.2、添加dockerfile-maven插件

          Dockerfile文件编写完成后,就可以使用Docker的框关指令构建镜靠并运行容器。然后流问容器中的应用了。只是上述所有的操作都是手动完成的,如果需要部署多个服务。将会丰常项

          针对这种情况MAVEN提供了一个dackerfile -maven-plugin插件,很好地支持了与Docker的整合。该插件的使用非常简单,只需要在所有需要生成Docker容器项目的pom文件中添加该插件,并进行一些相关配置即可,其具体使用示例如下。

    <build>
    		<plugins>
    			<!-- dockerfile plugin -->
    			<plugin>
    				<groupId>com.spotify</groupId>
    				<artifactId>dockerfile-maven-plugin</artifactId>
    				<version>1.3.6</version>
    				<configuration>
    					<!-- 生成的镜像仓库名称 -->
    					<repository>${docker.image.prefix}/${project.artifactId}</repository>
    					<!-- 生成的镜像版本 -->
    					<tag>${project.version}</tag>
    					<!-- 推送到私有镜像仓库时需要开启安全认证 -->
    					<useMavenSettingsForAuth>true</useMavenSettingsForAuth>
    				</configuration>
    				<!-- 直接使用mvn install命令打包项目,就会自动构建镜像和推送镜像 -->
    				<executions>
    					<execution>
    						<id>default</id>
    						<phase>install</phase>
    						<goals>
    							<goal>build</goal>
    							<goal>push</goal>
    						</goals>
    					</execution>
    				</executions>
    			</plugin>
    		</plugins>
    	</build>

    2.3、添加docker-compose.yml编排文件

          对于个别项目,可以直接通过Docker run等指令启动容器服务,但对于多个项目服务来有必要通过Docker compose编排工具运行服务。
          接下来,就为microservice-mallmanagement添加一个docker-composeyml编排文件以便后续使用Docker compose编排工具,具体如文件所示

    version: "3"
    services:
      mysql:
        image: mysql:5.6
        restart: on-failure
        ports:
          - 3306:3306
        volumes:
          - microservice-mysql:/var/lib/mysql
        networks:
          - microservice-net
        environment:
          MYSQL_ROOT_PASSWORD: root
          MYSQL_DATABASE: microservice_mallmanagement
        deploy:
          replicas: 1
          restart_policy:
            condition: on-failure
          placement:
            constraints: [node.role == manager]
    
      eureka-server:
        image: 192.168.159.143:5000/microservice-eureka-server:0.0.1-SNAPSHOT
        restart: on-failure
        ports:
          - 8761:8761
        networks:
          - microservice-net
        deploy:
          replicas: 1
          restart_policy:
            condition: on-failure
    
      gateway-zuul:
        image: 192.168.159.143:5000/microservice-gateway-zuul:0.0.1-SNAPSHOT
        restart: on-failure
        ports:
          - 8050:8050
        networks:
          - microservice-net
        depends_on:
          - eureka-server
        deploy:
          replicas: 1
          restart_policy:
            condition: on-failure
          placement:
            constraints: [node.role == manager]
    
      order-service:
        image: 192.168.159.143:5000/microservice-orderservice:0.0.1-SNAPSHOT
        restart: on-failure
        ports:
          - 7900:7900
        networks:
          - microservice-net
        depends_on:
          - mysql
          - eureka-server
        deploy:
          replicas: 2
          restart_policy:
            condition: on-failure
    
      user-service:
        image: 192.168.159.143:5000/microservice-userservice:0.0.1-SNAPSHOT
        restart: on-failure
        ports:
          - 8030:8030
        networks:
          - microservice-net
        depends_on:
          - mysql
          - eureka-server
        deploy:
          replicas: 2
          restart_policy:
            condition: on-failure
    
      visualizer:
        image: dockersamples/visualizer:stable
        ports:
          - 8081:8080
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
        deploy:
          placement:
            constraints: [node.role == manager]
        networks:
          - microservice-net
    
    networks:
      microservice-net:
    volumes:
      microservice-mysql:
    

    3、环境搭建及镜像准备

    3.1、搭建Docker主机

    3.2、安装应用编译工具JDK

    3.3、安装应用打包工具Maven

    3.3.1、下载Linux版本的Maven工具包,并解压:下载地址http://maven.apache.org/download.cgi


    3.3.2、将解压包移动到自定义目录下(这里将解压包直接移动到了opt目录下)

    3.3.3、配置Maven环境变量。修改/etc/profile文件,

    #set maven envirment
    export M2_HOME=/opt/apache-maven-3.6.1/
    export M2=$M2_HOME/bin
    export MAVEN_OPTS="-Xms256m -Xmx512m"
    export PATH=$M2:$PATH

    3.4、镜像准备

    由于之前3小节中dockerfile -maven的配置,在完成打包后也会自动构建镜像并推送到指定仓库,但无论是推送到Docker Hub还是本地私有镜像仓库,必须先登录认证才可进行推送。所以为了能够自动打包、构建镜像和推送镜像,在使用mvn install 命令打包之前,除了需要预先在dockerfile -maven插件配置中配置<useMavenSettingsForAuth>标签属性值为true外,还需要在Maven的settings.xml 配置文件(参考上一小节基础环境搭建时Maven的安装位置,此示例中的地址为/opt/apache -maven-3.5.0/confsettings.xml )中配置服务认证信息,具体配置内容如下( 注意要配置在<servers>标签内)。

    <id>192.168.159.143:5000</id>
            <username>yxk</username>
            <password>123</password>

            配置完成后,就可以将微服务项目microservice-malimanagement复制到manager1 服务主机的某个工作目录下,并进入到该项目pom文件所在位置(最外层的pom文件目录),然后使用mvn install 指令进行打包(首次打包会进行pom依赖文件的下载,所以需要一定的时间)。

          执行完mvn install指令后的效果如下图所示。

          如果出现如上图所示的“BUILD SUCCESS"信息,就表示打包、镜像构建和推送成功。如果某个过程执行失败,也可以从终端页面查看错误信息。

          当确定全部执行成功后,我们还可以实际确认。先通过docker images指令查看镜像列表中是否有生成的指定镜像,然后再次进入本地私有镜像仓库配置的挂载目录/mntregistry/docker/rogistryN2/repositories进行确认,查看生成的镜像是否也推送到了本地仓库。

    4、微服务的手动部署

    4.1、集群服务中的网卡选择性注册

    4.1.1、使用如下命令查看集群搭建后的网络列表详情。

    docker network ls

         从上图可以看出,当集群环境搭建完成后,会默认增加名为docker. gwbridge 和ingress的网络。其中ingress是集群环境下所有服务默认的网络管理方式,它主要用于在不同集群节点之间实现同一个服务的负载均衡,并且会默认为所有集群服务分配一个子网进行管理,而我们搭建微服务时,会根据需求自定义以overlay为驱动的网络用于多服务之间的通信管理。

          这样,在搭建的集群环境下,就会出现多网卡网络管理的情况。由于它们分别对应不同的业务管理,所以可能会使得注册到Eureka中的服务地址有偏差,从而导致服务之间的通信失败,以及API网关代理的通信失败问题。

          针对这个可能出现的问题,我们需要将自定义的网络,选择性地注册到Eureka注册中心上,具体的实现过程如下。

    4.1.2、根据微服务项目的需求,在集群环境下预先自定义一 个以overlay为驱动的网络进行本地集群服务网络管理,具体操作指令如下。
     

    docker network create -d overlay --subnet 10.0.0.0/24 microservice_net

           执行上述指令后,会创建一个以overlay为驱动,名为microservice-net的网络,并且通过-- subnet参数指定该自定义网络的子网地址以10.0开头。

    4.1.3、在所有需要注册到Eureka 注册中心的服务(包括microservice-gateway - zuul、microservice-orderservice和microservice-userservice服务)的配置文件application.yml中,添加指定注册到Eureka中心的优选服务子网地址信息,具体内容如下。

    spring:
       cloud:
          inetutils:
            preferred-networks:
            - 10.0   # 设置注册到Eureka中心的优选服务地址

          上述配置中,首先使用preferred-networks设置了该服务优选的网段以10.0开头,这与上面自定义的子网地址属于同一个网段;然后设置了prefer-ip-address属性值为true,表示优选通过IP地址找到对应的服务名称。

    4.1.4、修改服务部署的编排文件docker-compose.yml,将所有服务启动时的网络设置为前面预先自定义的microservice_ net 网络来进行网络管理,将修改后的编排文件重命名为docker-compose - swarm.yml,如下所示。

    version: "3"
    services:
      mysql:
        image: mysql:5.6
        restart: on-failure
        ports:
          - 3306:3306
        volumes:
          - microservice-mysql:/var/lib/mysql
        environment:
          MYSQL_ROOT_PASSWORD: root
          MYSQL_DATABASE: microservice_mallmanagement
        deploy:
          replicas: 1
          restart_policy:
            condition: on-failure
          placement:
            constraints: [node.role == manager]
    
      eureka-server:
        image: 192.168.159.143:5000/microservice-eureka-server:0.0.1-SNAPSHOT
        restart: on-failure
        ports:
          - 8761:8761
        deploy:
          replicas: 1
          restart_policy:
            condition: on-failure
    
      gateway-zuul:
        image: 192.168.159.143:5000/microservice-gateway-zuul:0.0.1-SNAPSHOT
        restart: on-failure
        ports:
          - 8050:8050
        depends_on:
          - eureka-server
        deploy:
          replicas: 1
          restart_policy:
            condition: on-failure
          placement:
            constraints: [node.role == manager]
    
      order-service:
        image: 192.168.159.143:5000/microservice-orderservice:0.0.1-SNAPSHOT
        restart: on-failure
        ports:
          - 7900:7900
        depends_on:
          - mysql
          - eureka-server
        deploy:
          replicas: 2
          restart_policy:
            condition: on-failure
    
      user-service:
        image: 192.168.159.143:5000/microservice-userservice:0.0.1-SNAPSHOT
        restart: on-failure
        ports:
          - 8030:8030
        depends_on:
          - mysql
          - eureka-server
        deploy:
          replicas: 2
          restart_policy:
            condition: on-failure
    
      visualizer:
        image: dockersamples/visualizer:stable
        ports:
          - 8081:8080
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
        deploy:
          placement:
            constraints: [node.role == manager]
    
    networks:
      default:
        external:
          name: microservice_net
    volumes:
      microservice-mysql:
    

    5、集群服务部署

    5.1、登录私有仓库

    docker login 192.168.159.143:5000

    5.2、部署服务

    注:进入为服务项目中docker-compose-swarm.yml文件所在目录下,使用docker stack deploy部署服务,具体操作如下

    docker stack deploy \
    > -c docker-compose-swarm.yml \
    > --with-registry-auth \
    > mallmanagement

    5.3、查看服务列表详情

    docker service ls

     

    5.4、在集群管理节点上,使用docker stack 的相关指令查看整个微服务项目在集群节点的分配与启动情况,

    docker stack ps mallmanagement

    5.5、上述指令中,docker stack ps用于查看整个微服务项目在集群节点的分配与启动情况,其中的mallmanagement就是在部署集群服务时指定的服务名称。

          另外,由于在集群环境下部署服务是在后台启动的,所以在Docker客户端无法查看各个服务的启动详情。这里可以在集群管理节点上通过Docker service提供的服务日志指令来进一步查看某个具体服务从启动到运行的整个日志情况,具体操作指令如下。

    docker service logs -f mallmanagement_oder-service

     

    6、微服务测试

    6.1、通过visuallizer集群服务可视化工具查看服务启动情况。微服务项目部署成功后,可以通过地址http://192.168.159.143:8081/(注意这是我的项目中manager1的主机地址,读者测试时要使用自己的主机地址)查看集群服务可视化工具visualizer 界面的显示情况,效果如图所示。

    6.2、通过Eureka注册中心查看服务的启动情况。我们还可以通过地址Http://192.168.159.143:8761/访问服务注册中心的情况。

    6.3、将数据库数据初始化。此项目中MySQL数据库是使用Docker容器构建的,所以对MySQL数据库服务上,具体操作如下。

    sudo apt install mysql-client-core-5.7

         

           执行上述指令后,就会在当前Docker 机器上安装一一个版本为5.7的MySQL客户端(这是使用当前Ubuntu下自带的安装包进行安装的),通过该客户端我们就可以连接到刚才启动的MySQL数据库服务上,具体操作指令如下。

    $ mysql -h 127.0.0.1 -uroot -P
    

           执行上述指令并连接成功后,就可以参考第9章中的9.1.3 小节对数据库microservice_mallmanagement中的表和数据进行初始化了。

          当然我们也可以不用在Docker机器上安装MySQL客户端来连接数据库进行数据操作,通过MySQL客户端连接工具(如Navicat )连接到启动的MySQL数据库的服务地址也可以进行数据库数据的初始化操作。

    6.4、测试微服务。

    分别连接用户管理微服务和订单管理微服务的访问地址进行测试,具体地址分别为htp:/:/192. 168.197.143:8030/swagger-ui.html和htp://192.168.197.143:7900/swagger-ui.html (读者需要根据自己项目的服务地址进行访问)。此时测试方式同https://blog.csdn.net/qq_37823605/article/details/91379272 中的Swagger-U效果测试完全一样。

    6.5、测试验证API网关服务。

    订单微服务接 口调用方法为http://192.168.159.143:7900/order-service/order/findOrders/1,而用户微服务接口调用方法为http://192.168.159.143:8050/order-service/order/findOrders/shitou,当使用Zuul 网关代理服务后,这两个微服务接口调用方法则分别更改为http://192.168.159.143:8050/order-service/order/findOrders/1和http://192.168.159.143:8050/order-service/order/findOrders/shitou(此时通过API网关访问其他所有的微服务时,访问者只会看到访问的是同一一个服务地址下的内容)。

     

    7、使用Jenkuns自动部署微服务

    7.1、Jenkins安装

    7.1.1、下载Jenkins。官网地址:https://jenkins.io/download/

    7.1.2、启动Jenkins服务

    java -jar jenkins.war --httpPort=49001

    7.1.3、Jenkins初始化安装。

    a)初始化认证密码

    b)初始化插件安装

    c)创建管理员用户

     

     

     

    7.2、Jenkins集成插件配置

    7.2.1、安装Maven插件

    7.2.2、系统全局插件配置

     

    7.3、服务自动化部署

    7.3.1、构建新任务

    7.3.2、配置源码仓库地址  https://github.com/Datacloudeyeshot/docker.git

    7.3.3、构建触发器

     

    7.3.4、服务发布配置

    7.4、自动化部署服务

    7.4.1、选择Console Output查看输出信息

    7.4.2、输出信息页面

    7.4.3、控制台信息提示

     

    总结:

    1、集群部署过程中,创建网络检查网段是否冲突;

    2、项目打包mvn install 时注意给项目包一定的执行权;

    3、切换管理员用户时,注意source一下环境变量,使maven和java的环境变量生效;

    4、在install过程中注意网络的连通性。

     

     

     

     

     

     

     

     

     

     

     

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 170,878
精华内容 68,351
关键字:

微服务项目