zoukankan      html  css  js  c++  java
  • Eureka集群和负载均衡

    Eureka集群和负载均衡

    #### 首先创建一个maven项目

    1.先删除掉src,然后只留pom.xml

    pom.xml

     <modules>
           <module>springcloud-api</module>
           <module>springcloud-provider-dept-8002</module>
           <module>springcloud-consumer-dept-80</module>
           <module>springcloud-eureka-7001</module>
           <module>springcloud-eurake-7002</module>
           <module>springcloud-eurake-7003</module>
           <module>springcloud-provider-dept-8003</module>
           <module>springcloud-provider-dept-8004</module>
           <module>springcloud-consumer-dept-feign</module>
           <module>springcloud-provider-dept-hystrix-8002</module>

       </modules>
       <!--打包方式-->
       <packaging>pom</packaging>
       <properties>
           <project.buile.sourceEncoding>UTF-8</project.buile.sourceEncoding>
           <maven-compiler-source>1.8</maven-compiler-source>
           <maven-compiler-target>1.8</maven-compiler-target>
           <junit.version>4.12</junit.version>
           <lombok.version>1.16.10</lombok.version>
           <log4j.version>1.2.17</log4j.version>
       </properties>
       <dependencyManagement>
           <dependencies>
               <!--springCloud的依赖-->
               <dependency>
                   <groupId>org.springframework.cloud</groupId>
                   <artifactId>spring-cloud-dependencies</artifactId>
                   <version>Greenwich.SR1</version>
                   <type>pom</type>
                   <scope>import</scope>
               </dependency>
               <!--springboot-->
               <dependency>
                   <groupId>org.springframework.boot</groupId>
                   <artifactId>spring-boot-dependencies</artifactId>
                   <version>2.1.4.RELEASE</version>
                   <type>pom</type>
                   <scope>import</scope>
               </dependency>
               <!--数据库的-->
               <dependency>
                   <groupId>mysql</groupId>
                   <artifactId>mysql-connector-java</artifactId>
                   <version>5.1.47</version>
               </dependency>
               <dependency>
                   <groupId>com.alibaba</groupId>
                   <artifactId>druid</artifactId>
                   <version>1.1.10</version>
               </dependency>
               <!--springboot启动器-->
               <dependency>
                   <groupId>org.mybatis.spring.boot</groupId>
                   <artifactId>mybatis-spring-boot-starter</artifactId>
                   <version>1.3.4</version>
               </dependency>
               <!--junit-->
               <dependency>
                   <groupId>junit</groupId>
                   <artifactId>junit</artifactId>
                   <version>${junit.version}</version>
               </dependency>
               <!--lombok-->
               <dependency>
                   <groupId>org.projectlombok</groupId>
                   <artifactId>lombok</artifactId>
                   <version>${lombok.version}</version>
               </dependency>
               <!--log4j-->
               <dependency>
                   <groupId>log4j</groupId>
                   <artifactId>log4j</artifactId>
                   <version>${log4j.version}</version>
               </dependency>
               <!--y用于日志和测试-->
               <dependency>
                   <groupId>ch.qos.logback</groupId>
                   <artifactId>logback-core</artifactId>
                   <version>1.2.3</version>
               </dependency>
           </dependencies>
       </dependencyManagement>
    </project>

    创建springcloud-api

    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>springcloud</artifactId>
           <groupId>com.liu</groupId>
           <version>1.0-SNAPSHOT</version>
       </parent>
       <modelVersion>4.0.0</modelVersion>

       <artifactId>springcloud-api</artifactId>
       <dependencies>
           <dependency>
               <groupId>org.projectlombok</groupId>
               <artifactId>lombok</artifactId>
           </dependency>
           <!--Feign做负载均衡时会在api里面加入fegin-->
           <dependency>
               <groupId>org.springframework.cloud</groupId>
               <artifactId>spring-cloud-starter-feign</artifactId>
               <version>1.4.6.RELEASE</version>
           </dependency>
       </dependencies>

    </project>

    创建Dept实体

    package com.example.pojo;

    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import lombok.experimental.Accessors;

    import java.io.Serializable;
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Accessors(chain = true)
    public class Dept implements Serializable {// 实体类
       private Long deptno;
       private String dname;
       // 这个数据存储在那个数据库的字段,为服务,一个服务对应一个数据库,
       // 同一个信息可能存在不同的数据库
       private String db_source;

       public Dept(String dname) {
           this.dname = dname;
      }

    /*
       链式写法:
           Dept dept=new Dept();
           dept.setDeptNo(11).setDname('sss').setDb_source
    */
    }

    当Fegin做负载均衡时(会创建DeptClientService类进行接口传递)

    package com.example.service;

    import com.example.pojo.Dept;
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.stereotype.Component;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.PostMapping;

    import java.util.List;

    @Component
    @FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT")
    public interface DeptClientService {

       @GetMapping("/dept/get/{id}")
       public Dept queryId(@PathVariable("id") Long id);

       @GetMapping("/dept/list")
       public List<Dept> queryAll();

       @PostMapping("/dept/add")
       public boolean addDept(Dept dept);

    }

     

    首先创建maven(springcloud-eureka-7001)

    pom.xml

    <dependencies>
           <dependency>
               <groupId>org.springframework.cloud</groupId>
               <artifactId>spring-cloud-starter-eureka-server</artifactId>
               <version>1.4.6.RELEASE</version>
           </dependency>
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-devtools</artifactId>
           </dependency>
       </dependencies>

    application.yml

    server:
     port: 7001
    #Eureka配置
    eureka:
     instance:
       hostname: eureka7001.com #eureka服务端的实例名称
     client:
       register-with-eureka: false  #标识是否向服务端注册自己
       fetch-registry: false #如果为false,表示自己为注册中心
       service-url:  # 监控页面
         # 单机 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
         # 集群(关联) defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
         defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

    启动类

    package com.example;

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

    @SpringBootApplication
    @EnableEurekaServer // 启动之后访问http://localhost:7001
    public class EurekaService_7001 {
       public static void main(String args[]){
           SpringApplication.run(EurekaService_7001.class,args);
      }
    }

    创建maven(springcloud-eurake-7002)

    pom.xml和启动类和7001相同(启动类名称不能一样)

    server:
     port: 7002

    #Eureka配置
    eureka:
     instance:
       hostname: eureka7002.com #eureka服务端的实例名称
     client:
       register-with-eureka: false  #标识是否向服务端注册自己
       fetch-registry: false #如果为false,表示自己为注册中心
       service-url:  # 监控页面
         defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7003.com:7003/eureka/

     

    创建maven(springcloud-eurake-70023

    pom.xml和启动类和7001相同(启动类名称不能一样)

    server:
     port: 7003

    #Eureka配置
    eureka:
     instance:
       hostname: eureka7003.com #eureka服务端的实例名称
     client:
       register-with-eureka: false  #标识是否向服务端注册自己
       fetch-registry: false #如果为false,表示自己为注册中心
       service-url:  # 监控页面
         defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/

    创建maven(springcloud-provider-dept-8002)

    pom.xml

     <dependencies>
           <!--加入eureka依赖-->
           <dependency>
               <groupId>org.springframework.cloud</groupId>
               <artifactId>spring-cloud-starter-eureka</artifactId>
               <version>1.4.6.RELEASE</version>
           </dependency>
           <!--增加Eureka监控用的配置依赖-->
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter-actuator</artifactId>
           </dependency>
           <dependency>
               <groupId>com.liu</groupId>
               <artifactId>springcloud-api</artifactId>
               <version>1.0-SNAPSHOT</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>
           <!--test-->
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-test</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-jetty</artifactId>
           </dependency>
           <!--热部署工具-->
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-devtools</artifactId>
           </dependency>
       </dependencies>

    创建mapper

    package com.example.mapper;

    import com.example.pojo.Dept;
    import org.apache.ibatis.annotations.Insert;
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Param;
    import org.apache.ibatis.annotations.Select;
    import org.springframework.stereotype.Repository;

    import java.util.List;

    @Mapper
    @Repository
    public interface DeptMapper {
       @Insert(value = "insert into dept values(default,#{dept.dname},DATABASE())")
       public boolean addDept(@Param("dept") Dept dept);
       @Select("select * from dept where deptno=#{deptno}")
       public Dept queryById(@Param("deptno") Long id);
       @Select("select * from dept")
       public List<Dept> query();
    }

    创建service

    package com.example.service;

    import com.example.mapper.DeptMapper;
    import com.example.pojo.Dept;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;

    import java.util.List;

    @Service
    public class DeptService {
       @Autowired
       private DeptMapper deptMapper;

       public boolean addDept(Dept dept) {
           return deptMapper.addDept(dept);
      }

       public Dept queryById(Long id) {
           return deptMapper.queryById(id);
      }

       public List<Dept> query() {
           return deptMapper.query();
      }
    }

    创建Controller

    package com.example.springcloud.controller;

    import com.example.pojo.Dept;
    import com.example.service.DeptService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cloud.client.ServiceInstance;
    import org.springframework.cloud.client.discovery.DiscoveryClient;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RestController;

    import java.util.List;

    @RestController
    public class DeptController {
       @Autowired
       private DeptService deptService;

       // 获取 一些配置信息,得到具体的微服务
       @Autowired
       private DiscoveryClient discoveryClient;

       @PostMapping("/dept/add")
       public boolean addDept(Dept dept) {
           return deptService.addDept(dept);

      }

       @GetMapping("/dept/get/{id}")
       public Dept get(@PathVariable("id") Long id) {
           Dept dept = deptService.queryById(id);
           if(dept==null){
               throw new RuntimeException("fail Please check you Code");
          }
           return dept;

      }

       @GetMapping("/dept/list")
       public List<Dept> addDept() {
           return deptService.query();

      }

       // 注册进来的微服务,获取一些信息‘ 这方法并非是业务代码,只是显示微服务的接口信息
       @GetMapping("/dept/discovery")
       public Object discovery() {
           // 获取到服务的列表清单
           List<String> services = discoveryClient.getServices();
           System.out.println("discovery=>services:" + services);

           List<ServiceInstance> instances = discoveryClient.getInstances("SPRINGCLOUD-PROVIDER-DEPT");
           for (ServiceInstance instance : instances) {
               System.out.println(
                       instance.getHost() + " " +
                               instance.getPort() + " " +
                               instance.getUri() + " " +
                               instance.getServiceId()
              );
          }
           return this.discoveryClient;
      }
    }

    启动类

    package com.example;

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

    @SpringBootApplication
    @EnableEurekaClient // 在服务开启之后会自动注册到eureka中
    @EnableDiscoveryClient // 服务发现·
    public class DeptProvider_8002 {
       public static void main(String args[]) {
           SpringApplication.run(DeptProvider_8002.class, args);
      }
    }

    application.yml配置

    server:
     port: 8002
    spring:
     application:
       name: springcloud-provider-dept
     datasource:
       url: jdbc:mysql://localhost:3306/mytest?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
       username: root
       password: root
       driver-class-name: com.mysql.jdbc.Driver
       type: com.alibaba.druid.pool.DruidDataSource
    mybatis:
     # model的包
     type-aliases-package: com.example.pojo
     configuration:
    #    开启驼峰uName自动映射到u_name
         map-underscore-to-camel-case: true

    # eureka的配置
    eureka:
     client:
       service-url:
         defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/,http://localhost:7003/eureka/
     instance:
       instance-id: springcloud-provider-dept-8002
       prefer-ip-address: true # true可以显示服务的IP地址

    # info 配置
    info:
     app.name: liuli-springcloud
     company.name: baidu.com

    如果需要创建多个负责均衡的话,则创建的maven项目和springcloud-provider-dept-8002相似,不过需要改端口号,数据库名,instance-id:

    =======================================================================================

    创建消费客户端maven(springcloud-consumer-dept-80)(带有Ribbon负载均衡)

    pom.xml

     <build>
           <plugins>
               <plugin>
                   <groupId>org.apache.maven.plugins</groupId>
                   <artifactId>maven-compiler-plugin</artifactId>
                   <configuration>
                       <source>7</source>
                       <target>7</target>
                   </configuration>
               </plugin>
           </plugins>
       </build>

       <!--实体类+web-->
       <dependencies>
           <!--Ribbon-->
           <dependency>
               <groupId>org.springframework.cloud</groupId>
               <artifactId>spring-cloud-starter-ribbon</artifactId>
               <version>1.4.6.RELEASE</version>
           </dependency>
           <!--Eurake-->
           <dependency>
               <groupId>org.springframework.cloud</groupId>
               <artifactId>spring-cloud-starter-eureka</artifactId>
               <version>1.4.6.RELEASE</version>
           </dependency>

           <dependency>
               <groupId>com.liu</groupId>
               <artifactId>springcloud-api</artifactId>
               <version>1.0-SNAPSHOT</version>
           </dependency>
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter-web</artifactId>
           </dependency>
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-devtools</artifactId>
           </dependency>
       </dependencies>

    application.yml

    server:
     port: 80

    #Eurake配置
    eureka:
     client:
       register-with-eureka: false # 不向eurake注册自己
       service-url:
         defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

    创建DeptConsumerController

    package com.example.springcloud.controller;

    import com.example.pojo.Dept;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;

    import java.util.List;

    @RestController
    public class DeptConsumerController {


       @Autowired
       private RestTemplate restTemplate;

       // Ribbon 我们这里的地址,应该是一个变量,通过服务者来访问
    //   private static final String REST_URL_PREFIX="http://localhost:8002";
       private static final String REST_URL_PREFIX="http://SPRINGCLOUD-PROVIDER-DEPT";

       @RequestMapping("/consumer/dept/get/{id}")
       public Dept get(@PathVariable("id")Long id){
           return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id,Dept.class);
      }
       @RequestMapping("/consumer/dept/add")
       public boolean add(Dept dept){
           System.out.println("客户端的信息=>"+dept);
           return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add?",dept,Boolean.class);
      }
       @RequestMapping("/consumer/dept/list")
       public List<Dept> get(){
           return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list",List.class);
      }
    }

    创建config配置类

    package com.example.springcloud.config;

    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;

    @Configuration
    public class ConfigBean {
       // 配置负载均衡实现RestTemplate
       @Bean
       @LoadBalanced // Ribbon
       public RestTemplate getRestTemplate(){
           return  new RestTemplate();
      }

    }

    创建Ribbon负载均衡类(tip:这个类的位置不可以和启动类同级,放在启动类的上一级目录)

    package com.example.myrule;

    import com.netflix.loadbalancer.IRule;
    import com.netflix.loadbalancer.RandomRule;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;

    @Configuration
    public class RibbonRuleDemo {
       @Bean
       public IRule myRule() {
           return new RandomRule();
      }
    }

    启动类

    package com.example.springcloud;

    import com.example.myrule.RibbonRuleDemo;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.cloud.netflix.ribbon.RibbonClient;

    // Ribbon 和 Eureka整合以后,客户端可以直接调用
    @SpringBootApplication
    @EnableEurekaClient
    @RibbonClient(name = "SPRINGCLOUD-PROVIDER-DEPT",configuration = RibbonRuleDemo.class)
    public class DeptConsumer_80 {
    public  static void main(String args[]){
       SpringApplication.run(DeptConsumer_80.class,args);
    }
    }

    Fegin做负载均衡时

    创建maven项目(springcloud-consumer-dept-feign)

    <?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>springcloud</artifactId>
           <groupId>com.liu</groupId>
           <version>1.0-SNAPSHOT</version>
       </parent>
       <modelVersion>4.0.0</modelVersion>

       <artifactId>springcloud-consumer-dept-feign</artifactId>
       <!--实体类+web-->
       <dependencies>
           <!--Feign-->
           <dependency>
               <groupId>org.springframework.cloud</groupId>
               <artifactId>spring-cloud-starter-feign</artifactId>
               <version>1.4.6.RELEASE</version>
           </dependency>
           <!--Ribbon-->
           <dependency>
               <groupId>org.springframework.cloud</groupId>
               <artifactId>spring-cloud-starter-ribbon</artifactId>
               <version>1.4.6.RELEASE</version>
           </dependency>
           <!--Eurake-->
           <dependency>
               <groupId>org.springframework.cloud</groupId>
               <artifactId>spring-cloud-starter-eureka</artifactId>
               <version>1.4.6.RELEASE</version>
           </dependency>

           <dependency>
               <groupId>com.liu</groupId>
               <artifactId>springcloud-api</artifactId>
               <version>1.0-SNAPSHOT</version>
           </dependency>
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter-web</artifactId>
           </dependency>
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-devtools</artifactId>
           </dependency>
       </dependencies>

    </project>

    application.yml

    server:
     port: 80

    #Eurake配置
    eureka:
     client:
       register-with-eureka: false # 不向eurake注册自己
       service-url:
         defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

    创建config配置类

    package com.example.springcloud.config;

    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;

    @Configuration
    public class ConfigBean {
       // 配置负载均衡实现RestTemplate
       @Bean
       @LoadBalanced // Ribbon
       public RestTemplate getRestTemplate(){
           return  new RestTemplate();
      }


    }

    创建controller类(DeptConsumerController)

    package com.example.springcloud.controller;

    import com.example.pojo.Dept;
    import com.example.service.DeptClientService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;

    import java.util.List;

    @RestController
    public class DeptConsumerController {


       @Autowired
       private DeptClientService deptClientService;

       @RequestMapping("/consumer/dept/get/{id}")
       public Dept get(@PathVariable("id") Long id) {
           return deptClientService.queryId(id);
      }

       @RequestMapping("/consumer/dept/add")
       public boolean add(Dept dept) {
           return deptClientService.addDept(dept);
      }

       @RequestMapping("/consumer/dept/list")
       public List<Dept> get() {
           return deptClientService.queryAll();
      }
    }

    启动类

    package com.example.springcloud;

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    import org.springframework.context.annotation.ComponentScan;

    // Ribbon 和 Eureka整合以后,客户端可以直接调用
    @SpringBootApplication
    @EnableEurekaClient
    @EnableFeignClients(basePackages = "com.example")
    @ComponentScan("com.example")
    public class FeignDeptConsumer_80 {
    public  static void main(String args[]){
       SpringApplication.run(FeignDeptConsumer_80.class,args);
    }
    }

     

  • 相关阅读:
    C语言实例解析精粹学习笔记——31
    进程调度(CFS)
    qemu中 guest与 host 网络配置
    网卡全虚拟化、virtio、vhost-net性能测试
    网桥与TAP设备
    进程调度
    中断、异常和系统调用
    文件系统
    Linux内核内存管理
    QEMU 设备模拟
  • 原文地址:https://www.cnblogs.com/liuli-warriors/p/12669026.html
Copyright © 2011-2022 走看看