zoukankan      html  css  js  c++  java
  • Spring Cloud之Ribbon与Nginx区别

    客户端负载均衡器

     在SpringCloud中Ribbon负载均衡客户端,会从eureka注册中心服务器端上获取服务注册信息列表,缓存到本地。

    让后在本地实现轮训负载均衡策略。

    Ribbon与Nginx区别

    1.服务器端负载均衡Nginx

     nginx是客户端所有请求统一交给nginx,由nginx进行实现负载均衡请求转发,属于服务器端负载均衡。

     既请求有nginx服务器端进行转发。

    2.客户端负载均衡Ribbon

     Ribbon是从eureka注册中心服务器端上获取服务注册信息列表,缓存到本地,让后在本地实现轮训负载均衡策略。

     既在客户端实现负载均衡。

     应用场景的区别:

    Nginx适合于服务器端实现负载均衡 比如Tomcat ,Ribbon适合与在微服务中RPC远程调用实现本地服务负载均衡,比如Dubbo、SpringCloud中都是采用本地负载均衡。

    Ribbon是Spring Cloud (本地)客户端负载均衡器

    Ribbon底层实现:

    Member:

    pom:

    <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.toov5</groupId>
      <artifactId>member</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      
      
    	<parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>2.0.1.RELEASE</version>
    	</parent>
    	<!-- 管理依赖 -->
    	<dependencyManagement>
    		<dependencies>
    			<dependency>
    				<groupId>org.springframework.cloud</groupId>
    				<artifactId>spring-cloud-dependencies</artifactId>
    				<version>Finchley.M7</version>
    				<type>pom</type>
    				<scope>import</scope>
    			</dependency>
    		</dependencies>
    	</dependencyManagement>
    	<dependencies>
    		<!-- SpringBoot整合Web组件 -->
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-web</artifactId>
    		</dependency>
    		<!-- SpringBoot整合eureka客户端 -->
    		<dependency>
    			<groupId>org.springframework.cloud</groupId>
    			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    		</dependency>
    	</dependencies>
    	<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
    	<repositories>
    		<repository>
    			<id>spring-milestones</id>
    			<name>Spring Milestones</name>
    			<url>https://repo.spring.io/libs-milestone</url>
    			<snapshots>
    				<enabled>false</enabled>
    			</snapshots>
    		</repository>
    	</repositories>
      
    </project>
    

      yml:

    ###服务启动端口号
    server:
      port: 8009
    ###服务名称(服务注册到eureka名称)  
    spring:
        application:
            name: app-toov5-member
    ###服务注册到eureka地址
    eureka:
      client:
        service-url:
        ##当前会员注册到eureka服务  地址+端口号 
               defaultZone: http://127.0.0.1:8100/eureka
               
    ###因为该应用为注册中心,不会注册自己
        register-with-eureka: true
    ###是否需要从eureka上获取注册信息
        fetch-registry: true

    Controller类

    package com.toov5.api.controller;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class MemberApiController {
        @Value("${server.port}")
        private String serverPort;
        
        @RequestMapping("/getMember")
      public String getMember() {
            return "会员服务"+serverPort;
      }
    }

      

    启动类:

    package com.toov5.api;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    
    @SpringBootApplication
    @EnableEurekaClient   //注册到eureka
    public class AppMember {
       
        public static void main(String[] args) {
            SpringApplication.run(AppMember.class, args);
        }
        
    }  

     Order

     Controlller

    package com.toov5.api.controller;
    
    import java.util.List;
    
    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.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    //纯手写Ribbon本地负载均衡
    @RestController
    public class ExtRibbonController {
        @Autowired
        private DiscoveryClient discoveryClient;
        @Autowired
        private RestTemplate restTemplate;
        //定义请求数
        private int reqCount;
        
    @RequestMapping("/ribbonMember")    
       public String ribbonMember() {
           //互殴去对应服务器远程调用地址
          String  instanceUrl =  getInstance()+"/getMember";
          System.out.println("instanceUrl"+instanceUrl);
            //直接使用httpclient远程调用。本次使用rest方式
          String result = restTemplate.getForObject(instanceUrl, String.class);  //底层使用httpclient实现的
           return result;
       }
       private String getInstance() {
           List<ServiceInstance> instances = discoveryClient.getInstances("app-toov5-member");
           if (instances==null || instances.size()==0) {
            return null;
        }
           int instanceSize = instances.size();
           int serviceIndex = reqCount%instanceSize;
           reqCount++;
            
           return instances.get(serviceIndex).getUri().toString();
       }
    }

     启动类:

    package com.toov5.api.controller;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.context.annotation.Bean;
    import org.springframework.web.client.RestTemplate;
    
    @SpringBootApplication
    @EnableEurekaClient
    public class AppOrder {
      public static void main(String[] args) {
        SpringApplication.run(AppOrder.class, args);
    }
      //解决RestTemplate找不到问题  把restTemplate注册到Spring Boot容器中
      @Bean
    //  @LoadBalanced   手写的 不要去实现本地负载均衡效果了
      RestTemplate restTemplate() {  
          return new RestTemplate();
      }
      
    }

    yml:

    ###服务启动端口号
    server:
      port: 8002
    ###服务名称(服务注册到eureka名称)  
    spring:
        application:
            name: app-toov5-order
    ###服务注册到eureka地址
    eureka:
      client:
        service-url:
               defaultZone: http://127.0.0.1:8100/eureka
    
               
    ###因为该应用为注册中心,不会注册自己
        register-with-eureka: true
    ###是否需要从eureka上获取注册信息
        fetch-registry: true
    

      pom

    <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.toov5</groupId>
      <artifactId>order</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      
      <parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>2.0.1.RELEASE</version>
    	</parent>
    	<!-- 管理依赖 -->
    	<dependencyManagement>
    		<dependencies>
    			<dependency>
    				<groupId>org.springframework.cloud</groupId>
    				<artifactId>spring-cloud-dependencies</artifactId>
    				<version>Finchley.M7</version>
    				<type>pom</type>
    				<scope>import</scope>
    			</dependency>
    		</dependencies>
    	</dependencyManagement>
    	<dependencies>
    		<!-- SpringBoot整合Web组件 -->
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-web</artifactId>
    		</dependency>
    		<!-- SpringBoot整合eureka客户端 -->
    		<dependency>
    			<groupId>org.springframework.cloud</groupId>
    			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    		</dependency>
    
    	</dependencies>
    	<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
    	<repositories>
    		<repository>
    			<id>spring-milestones</id>
    			<name>Spring Milestones</name>
    			<url>https://repo.spring.io/libs-milestone</url>
    			<snapshots>
    				<enabled>false</enabled>
    			</snapshots>
    		</repository>
    	</repositories>
    </project>
    

      Eureka

     pom

    <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.toov5</groupId>
      <artifactId>SpringCloud-eureka-server</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>2.0.1.RELEASE</version>
    	</parent>
    	<!-- 管理依赖 -->
    	<dependencyManagement>
    		<dependencies>
    			<dependency>
    				<groupId>org.springframework.cloud</groupId>
    				<artifactId>spring-cloud-dependencies</artifactId>
    				<version>Finchley.M7</version>
    				<type>pom</type>
    				<scope>import</scope>
    			</dependency>
    		</dependencies>
    	</dependencyManagement>
    	<dependencies>
    		<!--SpringCloud eureka-server -->
    		<dependency>
    			<groupId>org.springframework.cloud</groupId>
    			<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    		</dependency>
    	</dependencies> 
    	<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
    	<repositories>
    		<repository>
    			<id>spring-milestones</id>
    			<name>Spring Milestones</name>
    			<url>https://repo.spring.io/libs-milestone</url>
    			<snapshots>
    				<enabled>false</enabled>
    			</snapshots>
    		</repository>
    	</repositories>
      
    </project>
    

      yml

    ###eureka 服务端口号
    server:
      port: 8100
    ###服务注册名称
    eureka:
      instance:
      ##注册中心ip地址
        hostname: 127.0.0.1
    ###客户端调用地址
      client:
        serviceUrl:
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    ###因为该应用为注册中心,不会注册自己 (集群设为true)
        register-with-eureka: false
    ###因为自己为注册中心 ,不会去在该应用中的检测服务 
        fetch-registry: false
    

      

    package com.toov5;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    
    @EnableEurekaServer   //开启注册中心
    @SpringBootApplication 
    public class AppEureka {
      
         public static void main(String[] args) {
               SpringApplication.run(AppEureka.class, args);
        }
        
    }

    启动访问:

  • 相关阅读:
    Codeforces 451A Game With Sticks
    POJ 3624 Charm Bracelet
    POJ 2127 Greatest Common Increasing Subsequence
    POJ 1458 Common Subsequence
    HDU 1087 Super Jumping! Jumping! Jumping!
    HDU 1698
    HDU 1754
    POJ 1724
    POJ 1201
    CSUOJ 1256
  • 原文地址:https://www.cnblogs.com/toov5/p/9953971.html
Copyright © 2011-2022 走看看