SpringCloud之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="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>
<groupId&v5</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>
springcloud和springboot
<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>repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
  yml:
###服务启动端⼝号
server:
port: 8009
###服务名称(服务注册到eureka名称)
application:
name: app-toov5-member
###服务注册到eureka地址
eureka:
client:
service-url:
##当前会员注册到eureka服务地址+端⼝号
defaultZone: 127.0.0.1:8100/eureka
###因为该应⽤为注册中⼼,不会注册⾃⼰
register-with-eureka: true
###是否需要从eureka上获取注册信息
fetch-registry: true
Controller类
ller;
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;
}
}
启动类:
v5.api;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloudflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient  //注册到eureka
public class AppMember {
public static void main(String[] args) {
SpringApplication.run(AppMember.class, args);
}
}
Order
Controlller
ller;
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 = ForObject(instanceUrl, String.class);  //底层使⽤httpclient实现的return result;
}
private String getInstance() {
List<ServiceInstance> instances = Instances("app-toov5-member");
if (instances==null || instances.size()==0) {
return null;
}
int instanceSize = instances.size();
int serviceIndex = reqCount%instanceSize;
reqCount++;
(serviceIndex).getUri().toString();
}
}
ller;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloudflix.eureka.EnableEurekaClient;
import t.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: 127.0.0.1:8100/eureka
###因为该应⽤为注册中⼼,不会注册⾃⼰
register-with-eureka: true
###是否需要从eureka上获取注册信息
fetch-registry: true
  pom
<project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>
<groupId&v5</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>repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
  Eureka
pom
<project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>
<groupId&v5</groupId>
<artifactId>SpringCloud-eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<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>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: ${eureka.instance.hostname}:${server.port}/eureka/ ###因为该应⽤为注册中⼼,不会注册⾃⼰(集设为true)
register-with-eureka: false
###因为⾃⼰为注册中⼼ ,不会去在该应⽤中的检测服务
fetch-registry: false
v5;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloudflix.eureka.server.EnableEurekaServer; @EnableEurekaServer  //开启注册中⼼
@SpringBootApplication
public class AppEureka {
public static void main(String[] args) {
SpringApplication.run(AppEureka.class, args);
}
}
启动访问: