zoukankan      html  css  js  c++  java
  • (三)Spring Cloud Ribbon 实现服务访问的负载均衡

    本章将讲解通过Ribbon实现负载均衡去访问多台Eureka Client中的服务

    本项目是一个独立的maven项目,其中的多个module。

     Eureka-Server,Eureka-Client ,Eureka-Ribbon_Client模块,其中Eureka-Client后续会以2个端口启动,并分别在Eureka-Server注册

    1. 新建一个maven项目eureka-ribbon

    2. 新建一个eureka-server

     具体配置和上一篇类似

       2.1 pom文件

     <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-security</artifactId>
                <scope>compile</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-sleuth</artifactId>
            </dependency>

       2.2 启动类

      

    package com.devin.eurekaserver;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    
    
    @EnableEurekaServer
    @SpringBootApplication
    public class EurekaServerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(EurekaServerApplication.class, args);
        }
    
    }
    

     

       2.3 安全校验

       

    package com.devin.eurekaserver.config;
    
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    
    @EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            //关闭csrf
            super.configure(http);
            //开启认证
            http.csrf().disable();
        }
    }
    

     

      2.4 application.yml配置文件

       eureka-server的启动端口为 7001

    server:
      port: 7001 #启动端口
    spring:
      #应用名称
      application:
        name: eureka-server
      #安全配置
      security:
        basic:
          enabled: true
        user:
          name: dev
          password: 123456
    
    #eureka配置
    eureka:
      server:
        #设置扫描失效服务的间隔时间
        eviction-interval-timer-in-ms: 20000
        enable-self-preservation: true
      instance:
        hostname: localhost
        leaseRenewalIntervalInSeconds: 10
        health-check-url-path: /actuator/health
      client:
        register-with-eureka: false  #false:不作为一个客户端注册到注册中心
        fetch-registry: false        #为true时,可以启动,但报异常:Cannot execute request on any known server
        service-url:
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    
    # health endpoint是否必须显示全部细节。默认情况下, /actuator/health 是公开的,并且不显示细节。
    # 设置actuator开关
    management:
      security:
        enabled: false
      endpoints:
        web:
          exposure:
            include: "*"
      endpoint:
        health:
          show-details: ALWAYS

      3. 创建eureka-client

        eureka client后续将启动两个端口7002,7003,并分别在eureka-server注册

          3.1 pom文件

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>2.1.8.RELEASE</version>
            </dependency>

         3.2 启动类

       

    package com.devin.eurekaclient;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    
    @EnableEurekaClient
    @SpringBootApplication
    public class EurekaClientApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(EurekaClientApplication.class, args);
        }
    
    }
    

      

         3.3 新建一个Controller类,该类打印出eureka-client的启动端口

       

    package com.devin.eurekaclient.controller;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @author Devin Zhang
     * @className HelloController
     * @description TODO
     * @date 2020/3/28 10:45
     */
    
    @RestController
    public class HelloController {
    
        @Value("${server.port}")
        private Integer port;
    
        @GetMapping("/sayHello")
        public String sayHello(String name) {
            return "Hello ," + name + " ,this response is from eureka client port:" + port;
        }
    }
    

      

         3.4  application.yml 配置文件

    eureka:
      auth:
        user: dev
        password: 123456
      client:
        serviceUrl:
          defaultZone: http://${eureka.auth.user}:${eureka.auth.password}@localhost:7001/eureka/
      instance:
        #使用IP进行注册
        prefer-ip-address: true
        #配置实例的注册ID
        instance-id: ${spring.cloud.client.ip-address}:${server.port}
        #心跳时间,即服务续约间隔时间(缺省为30s)
        lease-renewal-interval-in-seconds: 5
        #发呆时间,即服务续约到期时间(缺省为90s)
        lease-expiration-duration-in-seconds: 10
        health-check-url-path: /actuator/health
    server:
      port: 7002
    spring:
      application:
        name: eureka-client

     启动eureka-client,分别在两个端口启动,这两个eureka-client实例将分别向 7001 eureka-server进行注册

     java -jar eureka-client-0.0.1-SNAPSHOT.jar --server.port=7002

     java -jar eureka-client-0.0.1-SNAPSHOT.jar --server.port=7003

     4.  eureka-client-ribbon 

      该服务将做为一个eureka-client进行注册,并通过RestTemplate对eureka-client进行负载均衡访问

          4.1  pom.xml

        

       <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>2.1.8.RELEASE</version>
            </dependency>

        4.2 启动类

        

    package com.devin.eurekaribbonclient;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    
    @EnableEurekaClient
    @SpringBootApplication
    public class EurekaRibbonClientApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(EurekaRibbonClientApplication.class, args);
        }
    
    }
    

      

          4.3 RestTemplate 配置类,支持负载均衡

    package com.devin.eurekaribbonclient.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;
    
    /**
     * @author Devin Zhang
     * @className RibbonConfig
     * @description TODO
     * @date 2020/3/28 11:51
     */
    @Configuration
    public class RibbonConfig {
    
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    }
    

      

        4.4  新建Service类,通过RestTemplate,负载均衡调用eureka-client的接口

         

    package com.devin.eurekaribbonclient.service;
    
    import org.springframework.stereotype.Service;
    import org.springframework.web.client.RestTemplate;
    
    import javax.annotation.Resource;
    
    /**
     * @author Devin Zhang
     * @className RibbonHelloService
     * @description TODO
     * @date 2020/3/28 11:54
     */
    @Service
    public class RibbonHelloService {
    
        @Resource
        private RestTemplate restTemplate;
    
        public String sayHello(String name) {
            return restTemplate.getForObject("http://EUREKA-CLIENT/sayHello?name=" + name, String.class);
        }
    }
    

      

           4.5  Controller入口类,用于测试

        

    package com.devin.eurekaribbonclient.controller;
    
    import com.devin.eurekaribbonclient.service.RibbonHelloService;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.annotation.Resource;
    
    /**
     * @author Devin Zhang
     * @className RibbonHelloController
     * @description TODO
     * @date 2020/3/28 11:57
     */
    @RestController
    public class RibbonHelloController {
    
        @Resource
        private RibbonHelloService ribbonHelloService;
    
        @GetMapping("/sayHelloFromRibbon")
        public String sayHello(String name) {
            return ribbonHelloService.sayHello(name);
        }
    }
    

      

      4.6  application.yml 配置文件

      

    eureka:
      auth:
        user: dev
        password: 123456
      client:
        serviceUrl:
          defaultZone: http://${eureka.auth.user}:${eureka.auth.password}@localhost:7001/eureka/
      instance:
        #使用IP进行注册
        prefer-ip-address: true
        #配置实例的注册ID
        instance-id: ${spring.cloud.client.ip-address}:${server.port}
        #心跳时间,即服务续约间隔时间(缺省为30s)
        lease-renewal-interval-in-seconds: 5
        #发呆时间,即服务续约到期时间(缺省为90s)
        lease-expiration-duration-in-seconds: 10
        health-check-url-path: /actuator/health
    server:
      port: 7004
    spring:
      application:
        name: eureka-ribbon-client

    5. 测试结果

     分别启动

      eureka-server 7001

      eureka-client 7002

      eureka-client 7003

      eureka-ribbon-client 7004

    在注册中心http://localhost:7001可以看到,各个客户端已经进行了注册

    验证负载均衡,访问 http://localhost:7004/sayHelloFromRibbon?name=devin   ,可以看到对eureka-client的访问,会负载均衡到 7002,7003 对应的实例

  • 相关阅读:
    react脚手架搭建及配置
    mac使用技巧
    nginx配置
    vue常见前端UI库
    自定义指令
    代码缩进修改
    webpack学习入门
    webpack使用extract-text-webpack-plugin打包时提示错误
    webpack未成功全局安装
    基于jQuery的AJAX实现三级联动菜单
  • 原文地址:https://www.cnblogs.com/DevinZhang1990/p/12587483.html
Copyright © 2011-2022 走看看