zoukankan      html  css  js  c++  java
  • Spring Cloud之部门微服务项目

    项目完整源码https://gitee.com/chuzhuyong/spring-cloud2020/tree/master

    本次项目使用的Spring Boot和Spring Cloud的版本

     Rest微服务构建案例工程模块

    一、使用maven构建整体父工程spring-cloud2020

    pom.xml

    <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.uos.springcloud</groupId>
      <artifactId>microservicecloud</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>pom</packaging>
     
     
      <properties>
       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
       <maven.compiler.source>1.8</maven.compiler.source>
       <maven.compiler.target>1.8</maven.compiler.target>
       <junit.version>4.12</junit.version>
       <log4j.version>1.2.17</log4j.version>
       <lombok.version>1.16.18</lombok.version>
      </properties>
     
      <dependencyManagement>
       <dependencies>
         <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-dependencies</artifactId>
           <version>Dalston.SR1</version>
           <type>pom</type>
           <scope>import</scope>
         </dependency>
         <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-dependencies</artifactId>
           <version>1.5.3.RELEASE</version>
           <type>pom</type>
           <scope>import</scope>
         </dependency>
         <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
           <version>5.0.4</version>
         </dependency>
         <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>druid</artifactId>
           <version>1.0.31</version>
         </dependency>
         <dependency>
           <groupId>org.mybatis.spring.boot</groupId>
           <artifactId>mybatis-spring-boot-starter</artifactId>
           <version>1.3.0</version>
         </dependency>
         <dependency>
           <groupId>ch.qos.logback</groupId>
           <artifactId>logback-core</artifactId>
           <version>1.2.3</version>
         </dependency>
         <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
           <version>${junit.version}</version>
           <scope>test</scope>
         </dependency>
         <dependency>
           <groupId>log4j</groupId>
           <artifactId>log4j</artifactId>
           <version>${log4j.version}</version>
         </dependency>
       </dependencies>
      </dependencyManagement>
    </project>

    二、microservicecloud-api公共子模块Module

    pom.xml

    <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>
    
        <parent><!-- 子类里面显示声明才能有明确的继承表现,无意外就是父类的默认版本否则自己定义 -->
            <groupId>com.uos.springcloud</groupId>
            <artifactId>microservicecloud</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </parent>
        <packaging>jar</packaging>
    
        <artifactId>microservicecloud-api</artifactId><!-- 当前Module我自己叫什么名字 -->
    
        <dependencies><!-- 当前Module需要用到的jar包,按自己需求添加,如果父类已经包含了,可以不用写版本号 -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
        </dependencies>
    </project>

    新建部门Entity且配合lombok使用

     每次新建一个子模块时,整体父工程的pom文件就会相应的增加对应的module

    三、microservicecloud-provider-dept-8001  部门微服务提供者Module

    pom.xml

     
    <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>
     
      <parent>
       <groupId>com.uos.springcloud</groupId>
       <artifactId>microservicecloud</artifactId>
       <version>0.0.1-SNAPSHOT</version>
      </parent>
     
      <artifactId>microservicecloud-provider-dept-8001</artifactId>
     
      <dependencies>
       <dependency><!-- 引入自己定义的api通用包,可以使用Dept部门Entity -->
         <groupId>com.uos.springcloud</groupId>
         <artifactId>microservicecloud-api</artifactId>
         <version>${project.version}</version>
       </dependency>
       <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
       </dependency>
       <dependency>
         <groupId>mysql</groupId>
         <artifactId>mysql-connector-java</artifactId>
       </dependency>
       <dependency>
         <groupId>com.alibaba</groupId>
         <artifactId>druid</artifactId>
       </dependency>
       <dependency>
         <groupId>ch.qos.logback</groupId>
         <artifactId>logback-core</artifactId>
       </dependency>
       <dependency>
         <groupId>org.mybatis.spring.boot</groupId>
         <artifactId>mybatis-spring-boot-starter</artifactId>
       </dependency>
       <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-jetty</artifactId>
       </dependency>
       <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
       </dependency>
       <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
       </dependency>
       <!-- 修改后立即生效,热部署 -->
       <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>springloaded</artifactId>
       </dependency>
       <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-devtools</artifactId>
       </dependency>
      </dependencies>
     
    </project>

    application.yml

    server:
      port: 8001
    
    mybatis:
      config-location: classpath:mybatis/mybatis.cfg.xml        # mybatis配置文件所在路径
      type-aliases-package: com.uos.springcloud.entities    # 所有Entity别名类所在包
      mapper-locations:
        - classpath:mybatis/mapper/**/*.xml                       # mapper映射文件
    
    spring:
      application:
        name: microservicecloud-dept
      datasource:
        type: com.alibaba.druid.pool.DruidDataSource            # 当前数据源操作类型
        driver-class-name: org.gjt.mm.mysql.Driver              # mysql驱动包
        url: jdbc:mysql://localhost:3306/cloudDB01?serverTimezone=UTC              # 数据库名称
        username: root
        password: 123456
        dbcp2:
          min-idle: 5                                           # 数据库连接池的最小维持连接数
          initial-size: 5                                       # 初始化连接数
          max-total: 5                                          # 最大连接数
          max-wait-millis: 200                                  # 等待连接获取的最大超时时间

    工程src/main/resources目录下新建mybatis文件夹后新建mybatis.cfg.xml文件

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
      PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-config.dtd">
      
    <configuration>
     
      <settings>
       <setting name="cacheEnabled" value="true"/><!-- 二级缓存开启 -->
      </settings>
     
    </configuration>

    MySQL创建部门数据库脚本

    DROP DATABASE IF EXISTS cloudDB01;
    CREATE DATABASE cloudDB01 CHARACTER SET UTF8;
    USE cloudDB01;
    CREATE TABLE dept
    (
      deptno BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
      dname VARCHAR(60),
      db_source   VARCHAR(60)
    );
     
    INSERT INTO dept(dname,db_source) VALUES('开发部',DATABASE());
    INSERT INTO dept(dname,db_source) VALUES('人事部',DATABASE());
    INSERT INTO dept(dname,db_source) VALUES('财务部',DATABASE());
    INSERT INTO dept(dname,db_source) VALUES('市场部',DATABASE());
    INSERT INTO dept(dname,db_source) VALUES('运维部',DATABASE());

    DeptDao部门接口

     工程src/main/resources/mybatis目录下新建mapper文件夹后再建DeptDao.xml

     DeptService部门服务接口

     DeptServiceImpl部门服务接口实现类

     DeptController部门微服务提供者REST

     DeptProvider8001_App主启动类DeptProvider8001_App

    package com.uos.springcloud;
     
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
     
    @SpringBootApplication
    public class DeptProvider8001_App{
      public static void main(String[] args){
       SpringApplication.run(DeptProvider8001_App.class, args);
      }
    }
     

    测试http://localhost:8001/dept/get/2

    测试 http://localhost:8001/dept/list

     四、microservicecloud-consumer-dept-80 部门微服务消费者Module

    pom.xml

    <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>
    
        <parent>
            <groupId>com.uos.springcloud</groupId>
            <artifactId>microservicecloud</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </parent>
    
        <artifactId>microservicecloud-consumer-dept-80</artifactId>
        <description>部门微服务消费者</description>
    
        <dependencies>
            <dependency><!-- 自己定义的api -->
                <groupId>com.uos.springcloud</groupId>
                <artifactId>microservicecloud-api</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <!-- 修改后立即生效,热部署 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>springloaded</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
            </dependency>
        </dependencies>
    </project>

    application.yml

    server:
      port: 8080

    com.uos.springcloud.cfgbeans包下ConfigBean的编写(类似spring里面的applicationContext.xml写入的注入Bean)

     com.uos.springcloud.controller包下新建DeptController_Consumer部门微服务消费者REST

    @RestController
    public class DeptController_Consumer
    {
        private static final String REST_URL_PREFIX = "http://localhost:8001";
    
        @Autowired
        private RestTemplate restTemplate;
        
        /**
         * 使用restTemplate访问restful接口非常的简单粗暴无脑。
         * (url, requestMap, ResponseBean.class)这三个参数分别代表
         * REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。
         */
        @RequestMapping(value="/consumer/dept/add")
        public boolean add(Dept dept) {
            return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add", dept, Boolean.class);
        }
    
        @RequestMapping(value="/consumer/dept/get/{id}")
        public Dept get(@PathVariable("id") Long id) {
            return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id, Dept.class);
        }
    
        @SuppressWarnings("unchecked")
        @RequestMapping(value="/consumer/dept/list")
        public List<Dept> list() {
            return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list", List.class);
        }
    }

    DeptConsumer80_App主启动类

     测试http://localhost:8080/consumer/dept/get/2

     测试http://localhost:8080/consumer/dept/list

     测试http://localhost:8080/consumer/dept/add?dname=AI

     Eureka服务注册与发现

    构建步骤

    一、microservicecloud-eureka-7001  eureka服务注册中心Module

    pom.xml

    <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>
    
        <parent>
            <groupId>com.uos.springcloud</groupId>
            <artifactId>microservicecloud</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </parent>
    
        <artifactId>microservicecloud-eureka-7001</artifactId>
    
        <dependencies>
            <!--eureka-server服务端 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka-server</artifactId>
            </dependency>
            <!-- 修改后立即生效,热部署 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>springloaded</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
            </dependency>
        </dependencies>
    
    </project>

    application.yml

     
    server: 
      port: 7001
     
    eureka:
      instance:
        hostname: localhost #eureka服务端的实例名称
      client:
        register-with-eureka: false #false表示不向注册中心注册自己。
        fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
        service-url:
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/        #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
     

    EurekaServer7001_App主启动类

     测试http://localhost:7001/

    No application available 没有服务被发现   因为没有注册服务进来当然不可能有服务被发现

    二、修改microservicecloud-provider-dept-8001  将已有的部门微服务注册进eureka服务中心

     向pom.xml中添加

     
       <!-- 将微服务provider注册进eureka -->
       <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-eureka</artifactId>
       </dependency>
       <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-config</artifactId>
       </dependency>

    向application.yml中添加

    eureka:
      client: #客户端注册进eureka服务列表内
        service-url: 
          defaultZone: http://localhost:7001/eureka

    DeptProvider8001_App主启动类

    添加@EnableEurekaClient //本服务启动后会自动注册进eureka服务中

    测试

    先要启动EurekaServer

     三、actuator与注册微服务信息完善

    主机名称:服务名称修改

    修改microservicecloud-provider-dept-8001

    向application.yml中添加

    instance:
        instance-id: microservicecloud-dept8001

    访问信息有IP信息提示

    prefer-ip-address: true     #访问路径可以显示IP地址

    微服务info内容详细信息

    修改microservicecloud-provider-dept-8001

    向pom.xml中添加

       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-actuator</artifactId>
       </dependency>

    总的父工程修改pom.xml添加构建build信息

    <build>
       <finalName>microservicecloud</finalName>
       <resources>
         <resource>
           <directory>src/main/resources</directory>
           <filtering>true</filtering>
         </resource>
       </resources>
       <plugins>
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-resources-plugin</artifactId>
           <configuration>
             <delimiters>
              <delimit>$</delimit>
             </delimiters>
           </configuration>
         </plugin>
       </plugins>
      </build>

    修改microservicecloud-provider-dept-8001

    application.yml

    info:
      app.name: uos-microservicecloud
      company.name: www.baidu.com
      build.artifactId: $project.artifactId$
      build.version: $project.version$

     集群配置

    一、新建microservicecloud-eureka-7002/microservicecloud-eureka-7003

    二、按照7001为模板粘贴pom

    三、修改7002和7003的主启动类

    四、修改映射配置

     五、3台eureka服务器的yml配置

    7001

    server:
      port: 7001
    
    eureka:
      instance:
        hostname: eureka7001.com #eureka服务端的实例名称
      client:
        register-with-eureka: false     #false表示不向注册中心注册自己。
        fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
        service-url:
          #单机 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/       #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址(单机)。
          defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

    7002

    server:
      port: 7002
    
    eureka:
      instance:
        hostname: eureka7002.com #eureka服务端的实例名称
      client:
        register-with-eureka: false     #false表示不向注册中心注册自己。
        fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
        service-url:
          #defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/       #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
          defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7003.com:7003/eureka/

    7003

    server:
      port: 7003
    
    eureka:
      instance:
        hostname: eureka7003.com #eureka服务端的实例名称
      client:
        register-with-eureka: false     #false表示不向注册中心注册自己。
        fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
        service-url:
          #defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/       #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
          defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/

    六、microservicecloud-provider-dept-8001 微服务发布到上面3台eureka集群配置中

     测试http://eureka7001.com:7001/ 同理可以测试http://eureka7002.com:7002/ ,http://eureka7003.com:7003/ 

     Ribbon负载均衡

     一、Ribbon配置初步

    修改microservicecloud-consumer-dept-80工程

    在修改pom.xml文件中添加

         <!-- Ribbon相关 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-ribbon</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-config</artifactId>
            </dependency>

    修改application.yml   追加eureka的服务注册地址

    eureka:
      client:
        service-url:
          register-with-eureka: false     #false表示不向注册中心注册自己。
          defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

    对ConfigBean进行新注解@LoadBalanced    获得Rest时加入Ribbon的配置

     

     主启动类DeptConsumer80_App添加@EnableEurekaClient

     修改DeptController_Consumer客户端访问类

     先启动3个eureka集群后,再启动microservicecloud-provider-dept-8001并注册进eureka,再启动microservicecloud-consumer-dept-80

     测试

     

     

     

     二、Ribbon负载均衡

    架构说明

    Ribbon在工作时分成两步
    第一步先选择 EurekaServer ,它优先选择在同一个区域内负载较少的server.
    第二步再根据用户指定的策略,在从server取到的服务注册列表中选择一个地址。
    其中Ribbon提供了多种策略:比如轮询、随机和根据响应时间加权。

    参考microservicecloud-provider-dept-8001,新建两份,分别命名为8002,8003

    新建8002/8003数据库,各自微服务分别连各自的数据库

    8002SQL脚本

     
    DROP DATABASE IF EXISTS cloudDB02;
     
    CREATE DATABASE cloudDB02 CHARACTER SET UTF8;
     
    USE cloudDB02;
     
    CREATE TABLE dept
    (
      deptno BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
      dname VARCHAR(60),
      db_source   VARCHAR(60)
    );
     
    INSERT INTO dept(dname,db_source) VALUES('开发部',DATABASE());
    INSERT INTO dept(dname,db_source) VALUES('人事部',DATABASE());
    INSERT INTO dept(dname,db_source) VALUES('财务部',DATABASE());
    INSERT INTO dept(dname,db_source) VALUES('市场部',DATABASE());
    INSERT INTO dept(dname,db_source) VALUES('运维部',DATABASE());

    8003SQL脚本

    DROP DATABASE IF EXISTS cloudDB03;
     
    CREATE DATABASE cloudDB03 CHARACTER SET UTF8;
     
    USE cloudDB03;
     
     
    CREATE TABLE dept
    (
      deptno BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
      dname VARCHAR(60),
      db_source   VARCHAR(60)
    );
     
    INSERT INTO dept(dname,db_source) VALUES('开发部',DATABASE());
    INSERT INTO dept(dname,db_source) VALUES('人事部',DATABASE());
    INSERT INTO dept(dname,db_source) VALUES('财务部',DATABASE());
    INSERT INTO dept(dname,db_source) VALUES('市场部',DATABASE());
    INSERT INTO dept(dname,db_source) VALUES('运维部',DATABASE());

    修改8002/8003各自YML

    8002YML

    server:
      port: 8002
    
    mybatis:
      config-location: classpath:mybatis/mybatis.cfg.xml        # mybatis配置文件所在路径
      type-aliases-package: com.uos.springcloud.entities    # 所有Entity别名类所在包
      mapper-locations:
        - classpath:mybatis/mapper/**/*.xml                       # mapper映射文件
    
    spring:
      application:
        name: microservicecloud-dept
      datasource:
        type: com.alibaba.druid.pool.DruidDataSource            # 当前数据源操作类型
        driver-class-name: org.gjt.mm.mysql.Driver              # mysql驱动包
        url: jdbc:mysql://localhost:3306/cloudDB02?serverTimezone=UTC              # 数据库名称
        username: root
        password: 123456
        dbcp2:
          min-idle: 5                                           # 数据库连接池的最小维持连接数
          initial-size: 5                                       # 初始化连接数
          max-total: 5                                          # 最大连接数
          max-wait-millis: 200                                  # 等待连接获取的最大超时时间
    eureka:
      client: #客户端注册进eureka服务列表内
        service-url:
          defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
    
      instance:
        instance-id: microservicecloud-dept8002
        prefer-ip-address: true     #访问路径可以显示IP地址
    info:
      app.name: uos-microservicecloud
      company.name: www.baidu.com
      build.artifactId: $project.artifactId$
      build.version: $project.version$

    8003YML

    server:
      port: 8003
    
    mybatis:
      config-location: classpath:mybatis/mybatis.cfg.xml        # mybatis配置文件所在路径
      type-aliases-package: com.uos.springcloud.entities    # 所有Entity别名类所在包
      mapper-locations:
        - classpath:mybatis/mapper/**/*.xml                       # mapper映射文件
    
    spring:
      application:
        name: microservicecloud-dept
      datasource:
        type: com.alibaba.druid.pool.DruidDataSource            # 当前数据源操作类型
        driver-class-name: org.gjt.mm.mysql.Driver              # mysql驱动包
        url: jdbc:mysql://localhost:3306/cloudDB03?serverTimezone=UTC              # 数据库名称
        username: root
        password: 123456
        dbcp2:
          min-idle: 5                                           # 数据库连接池的最小维持连接数
          initial-size: 5                                       # 初始化连接数
          max-total: 5                                          # 最大连接数
          max-wait-millis: 200                                  # 等待连接获取的最大超时时间
    eureka:
      client: #客户端注册进eureka服务列表内
        service-url:
          defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
    
      instance:
        instance-id: microservicecloud-dept8003
        prefer-ip-address: true     #访问路径可以显示IP地址
    info:
      app.name: uos-microservicecloud
      company.name: www.baidu.com
      build.artifactId: $project.artifactId$
      build.version: $project.version$

    启动3个eureka集群配置区

    启动3个Dept微服务启动并各自测试通过

     

     

    启动microservicecloud-consumer-dept-80

    客户端通过Ribbo完成负载均衡并访问上一步的Dept微服务

    默认使用的是轮询算法,每个微服务都会被轮询访问一次

    总结:Ribbon其实就是一个软负载均衡的客户端组件,
    他可以和其他所需请求的客户端结合使用,和eureka结合只是其中的一个实例。

    三、 Ribbon核心组件IRule

    根据特定的算法从服务列表中选取一个要访问的服务

     

     

    四、Ribbon自定义

    主启动类上添加@RibbonClient注解

     

    注意:Ribbon自定义配置类不能在包含@CompentScan注解的包及子包下新建

    在上述过程中,我们新建一个myrule包,在myrule包下新建MySelfRule配置类。

    在github上复制并修改源码 https://github.com/Netflix/ribbon/blob/master/ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/RandomRule.java

     

     Feign负载均衡

    参考microservicecloud-consumer-dept-80,新建microservicecloud-consumer-dept-feign

    microservicecloud-consumer-dept-feign工程pom.xml修改,主要添加对feign的支持

    修改microservicecloud-api工程

    pom.xml

     新建DeptClientService接口并新增注解@FeignClient

    microservicecloud-consumer-dept-feign工程修改Controller,添加上一步新建的DeptClientService接口

     microservicecloud-consumer-dept-feign工程修改主启动类

     

    测试

     

    总结

    Feign通过接口的方法调用Rest服务(之前是Ribbon+RestTemplate),该请求发送给Eureka服务器(http://MICROSERVICECLOUD-DEPT/dept/list),

    通过Feign直接找到服务接口,由于在进行服务调用的时候融合了Ribbon技术,所以也支持负载均衡作用。 

     

    服务熔断

    参考microservicecloud-provider-dept-8001,新建microservicecloud-provider-dept-hystrix-8001

     pom.xml

     application.yml

     修改DeptController

     修改主启动类DeptProvider8001_Hystrix_App并添加新注解@EnableCircuitBreaker

     测试

     

     服务降级

    修改microservicecloud-api工程,
    根据已经有的DeptClientService接口新建一个实现了
    FallbackFactory接口的类DeptClientServiceFallbackFactory

    @Component
    public class DeptClientServiceFallbackFactory implements FallbackFactory<DeptClientService> {
        @Override
        public DeptClientService create(Throwable throwable) {
            return new DeptClientService() {
                @Override
                public Dept get(long id) {
                    return new Dept().setDeptno(id)
                            .setDname("该ID:"+id+"没有对应的信息,Consumer客户端提供的降级信息,此刻服务Provider已经关闭")
                            .setDb_source("no this database in MySQL");
                }
    
                @Override
                public List<Dept> list() {
                    return null;
                }
    
                @Override
                public boolean add(Dept dept) {
                    return false;
                }
            };
        }
    }

    修改microservicecloud-api工程,DeptClientService接口在注解@FeignClient中添加fallbackFactory属性值

     

     microservicecloud-consumer-dept-feign工程修改YML

     测试

     

     服务监控hystrixDashboard

     新建工程microservicecloud-consumer-hystrix-dashboard

    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">
        <parent>
            <artifactId>microservicecloud</artifactId>
            <groupId>com.uos.springcloud</groupId>
            <version>0.0.1-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>microservicecloud-consumer-hystrix-dashboard</artifactId>
        <dependencies>
            <!-- 自己定义的api -->
            <dependency>
                <groupId>com.uos.springcloud</groupId>
                <artifactId>microservicecloud-api</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <!-- 修改后立即生效,热部署 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>springloaded</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
            </dependency>
            <!-- Ribbon相关 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-ribbon</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-config</artifactId>
            </dependency>
            <!-- feign相关 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-feign</artifactId>
            </dependency>
            <!-- hystrix和 hystrix-dashboard相关-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-hystrix</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
            </dependency>
        </dependencies>
    </project>

    application.yml

    server:
      port: 9001

    主启动类改名+新注解@EnableHystrixDashboard

     所有Provider微服务提供类(8001/8002/8003)都需要监控依赖配置

         <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>

    启动microservicecloud-consumer-hystrix-dashboard该微服务监控消费端

    启动3个eureka集群

    启动microservicecloud-provider-dept-hystrix-8001

    启动的相关微服务工程

     

     

     

    实心圆:共有两种含义。它通过颜色的变化代表了实例的健康程度,它的健康度从绿色<黄色<橙色<红色递减。
    该实心圆除了颜色的变化之外,它的大小也会根据实例的请求流量发生变化,流量越大该实心圆就越大。所以通过该实心圆的展示,就可以在大量的实例中快速的发现故障实例和高压力实例。

    说明

    复杂图形

     zuul路由网关

    一、路由基本配置

    新建Module模块microservicecloud-zuul-gateway-9527

    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">
        <parent>
            <artifactId>microservicecloud</artifactId>
            <groupId>com.uos.springcloud</groupId>
            <version>0.0.1-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>microservicecloud-zuul-gateway-9527</artifactId>
        <dependencies>
            <!-- zuul路由网关 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-zuul</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
            </dependency>
            <!-- actuator监控 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <!--  hystrix容错-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-hystrix</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-config</artifactId>
            </dependency>
            <!-- 日常标配 -->
            <dependency>
                <groupId>com.uos.springcloud</groupId>
                <artifactId>microservicecloud-api</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jetty</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
            </dependency>
            <!-- 热部署插件 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>springloaded</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
            </dependency>
        </dependencies>
    
    
    </project>

    application.yml

    server:
      port: 9527
    
    spring:
      application:
        name: microservicecloud-zuul-gateway
    
    eureka:
      client:
        service-url:
          defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
      instance:
        instance-id: gateway-9527.com
        prefer-ip-address: true
    
    
    info:
      app.name: uos-microcloud
      company.name: www.uos.com
      build.artifactId: $project.artifactId$
      build.version: $project.version$

    hosts文件修改

     主启动类

     

     不用路由

     使用路由

     二、路由访问映射规则

    代理名称

     

     测试

     Spring Cloud Config分布式配置中心

    在github上新建一个名称为microservicecloud-config的仓库

    由上一步获得SSH协议的git地址    git@github.com:Amonologue129/microservicecloud-config.git

    本地硬盘目录上新建 git仓库并clone

    在本地路径下新建一个application.yml

     

     将上一步的yml文件推送到github上

    新建 microservicecloud-config-3344 module

    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">
        <parent>
            <artifactId>microservicecloud</artifactId>
            <groupId>com.uos.springcloud</groupId>
            <version>0.0.1-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>microservicecloud-config-3344</artifactId>
        <dependencies>
            <!--Spring Cloud Config相关-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-config-server</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
    </project>

    application.yml

    server:
      port: 3344
    spring:
      application:
        name: microservicecloud-config
      cloud:
        config:
          server:
            git:
             
               uri: https://github.com/Amonologue129/microservicecloud-config.git
    username:
    password:
    
    

    主启动类

     hosts文件修改 127.0.0.1 config-3344.com

     

     

     访问的方式

     在E:44mySpringCloudmicroservicecloud-config下新建microservicecloud-config-client.yml文件并上传到github上

    server:
      port: 8201
    spring:
      profiles: dev
      application:
        name: microservicecloud-config-client
    eureka:
      client:
        service-url:
          defaultZone: http://eureka-dev.com:7001/eureka
    ---
    server:
      port: 8202
    
    spring:
      profiles: test
      application:
        name: microservicecloud-config-client
    eureka:
      client:
        service-url:
          defaultZone: http://eureka-test.com:7001/eureka

    配置客户端

    新建microservicecloud-config-client-3355 Module

    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">
        <parent>
            <artifactId>microservicecloud</artifactId>
            <groupId>com.uos.springcloud</groupId>
            <version>0.0.1-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>microservicecloud-config-client-3355</artifactId>
        <dependencies>
            <!-- spring cloud config 客户端-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-config</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        </dependencies>
    
    </project>

    bootstrap.yml

    ## application.yml 是用户级别的资源配置项
    ## bootstrap.yml 是系统级别的。优先级更高
    spring:
      cloud:
        config:
          name: microservicecloud-config-client   # 需要从git 上读取的资源名称,注意没有yml后缀
          profile: dev  # 本次访问的配置项
          label: master
          uri: http://config-3344.com:3344   # 本微服务启动后先去找到 3344 微服务,通过SpringCloudConfigServer

    application.yml 

    spring:
      application:
        name: microservicecloud-config-client

    修改hosts文件    127.0.0.1  client-config.com

    在com.uos.springcloud.rest下新建ConfigClientRest类

    @RestController
    public class ConfigClientRest {
    
        @Value("${spring.application.name}")
        private String applicationName;
    
        @Value("${eureka.client.service-url.defaultZone}")
        private String eurekaServer;
        @Value("${server.port}")
        private String serverPort;
    
        @RequestMapping("/config")
        public String getConfig(){
            String str = "application: " + applicationName + "	 eurekaServers:" + eurekaServer + " 	 serverPort" + serverPort;
            System.out.println(str);
            return str;
        }
    }

    主启动类

    测试

    Config项目实战

    git配置文件本地配置

    microservicecloud-config-eureka-client.yml

    文件地址  https://github.com/Amonologue129/microservicecloud-config/blob/master/microservicecloud-config-eureka-client.yml

    microservicecloud-config-dept-client.yml

    文件地址 https://github.com/Amonologue129/microservicecloud-config/blob/master/microservicecloud-config-dept-client.yml

    config版的Eureka服务端

    新建microservicecloud-config-eureka-client-7001

    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">
        <parent>
            <artifactId>microservicecloud</artifactId>
            <groupId>com.uos.springcloud</groupId>
            <version>0.0.1-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>microservicecloud-config-eureka-client-7001</artifactId>
        <dependencies>
            <!-- eureka-server注册中心 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka-server</artifactId>
            </dependency>
            <!-- config配置中心 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-config</artifactId>
            </dependency>
            <!-- 热部署 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>springloaded</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
            </dependency>
        </dependencies>
    
    </project>

    主启动类

     bootstrap.yml

    ## application.yml 是用户级别的资源配置项
    ## bootstrap.yml 是系统级别的。优先级更高
    spring:
      cloud:
        config:
          name: microservicecloud-config-eureka-client   # 需要从git 上读取的资源名称,注意没有yml后缀
          profile: dev  # 本次访问的配置项
          label: master
          uri: http://config-3344.com:3344   # 本微服务启动后先去找到 3344 微服务,通过SpringCloudConfigServer

    application.yml

    spring:
      application:
        name: microservicecloud-config-eureka-client

    Config的Eureka微服务

     参考之前的8001新建microservicecloud-config-dept-client-8001

    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">
        <parent>
            <artifactId>microservicecloud</artifactId>
            <groupId>com.uos.springcloud</groupId>
            <version>0.0.1-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>microservicecloud-config-dept-client-8001</artifactId>
        <dependencies>
            <dependency><!-- 引入自己定义的api通用包,可以使用Dept部门Entity -->
                <groupId>com.uos.springcloud</groupId>
                <artifactId>microservicecloud-api</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jetty</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
            </dependency>
            <!-- 修改后立即生效,热部署 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>springloaded</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
            </dependency>
    
            <!-- 将微服务provider注册进eureka -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-config</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
        </dependencies>
    
    </project>

    bootstrap.yml

    ## application.yml 是用户级别的资源配置项
    ## bootstrap.yml 是系统级别的。优先级更高
    spring:
      cloud:
        config:
          name: microservicecloud-config-dept-client    # 需要从git 上读取的资源名称,注意没有yml后缀
          profile: dev  # 本次访问的配置项
          label: master
          uri: http://config-3344.com:3344   # SpringCloudConfig获取的服务地址

    application.yml

    spring:
      application:
        name: microservicecloud-config-dept-client

    其余文件,直接复制microservicecloud-provider-dept-8001

  • 相关阅读:
    网页设计太麻烦?15款免费优质Bootstrap UI工具包助你效率倍增!
    【自古套路得人心】最全UI图表设计技巧和套路,分分钟打造最优设计
    原型对接工作流!摹客全面支持Axure原型
    赶紧收藏!41个Web UI工具包资源免费及付费下载
    2019年设计师必看,UI加载动画完全解读
    845G
    845G
    845D
    845C
    845B
  • 原文地址:https://www.cnblogs.com/my-program-life/p/12212873.html
Copyright © 2011-2022 走看看