ICAT技术 阅读:871评论: 0 2018-08-24

简单介绍下负载均衡的原理?

image.png

  (1)图上可以看到我们使用的rebboin做的负载均衡,其中会员有一个订单服务和2个会员服务。

  (2)我们的订单服务需要远程调用会员服务,首先找到注册中心的服务列表相关名为service-member,其中名为service-menber的服务有2个,我们的负载均衡就启动到了作用。rebboin拿到了多个需要跳转的会员服务。

  (3)rebboin通过负载均衡的策略算法分发指定服务。(有着nginx相同的作用,比如部署多台tomcat,nginx给你做均衡转发


下面教搭建如何使用这个负载均衡。由于之前已经教大家如何搭建注册中心,提供者,消费者的项目了。我们就接着上个项目写。

https://blog.techauch.com/get/detail/128757


第一步:我们在建一个会员服务的项目

(1)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">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.example</groupId>
	<artifactId>eureka.menber2</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>eureka.menber2</name>
	<description>Demo project for Spring Boot</description>

	<!--基于Springboot -->
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.4.0.RELEASE</version>
		<relativePath />
	</parent>

	<properties>
		<!--设置字符编码及java版本 -->
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<!--增加eureka-server的依赖 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</artifactId>
		</dependency>
		<!--用于测试的,本例可省略 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<!--依赖管理,用于管理spring-cloud的依赖,其中Camden.SR3是版本号 -->
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Camden.SR3</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>



</project>

(2)application.yml

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8888/eureka/
server:
  port: 8764
spring:
  application:
    name: server-menber

这里的name要和另一个服务的name相同


(3)新建一个控制类,写一个接口测试

package com.example.demo;

import java.util.ArrayList;
import java.util.List;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
	@RequestMapping("/getMenberAll")
	public List<String> getMenberAll() {
		List<String> list = new ArrayList<>();
		list.add("大米");
		list.add("70");
		list.add("3");
		list.add("我是第二台服务!");
		return list;
	}
}

这里区分一下,在这台服务上加入标示第二台服务


(4)新建启动类

package com.example.demo;

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

@SpringBootApplication
@EnableEurekaClient
public class Application {

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}


第二步:新建一个项目完成后,在开启负载均衡功能

远程调用服务前需要讲RestTemplate注册到bean中

/**
 * 注册到bean容器
 */
@Bean
@LoadBalanced
RestTemplate restTemplate() {
	return new RestTemplate();
}

@LoadBalanced这个注解开启负载均衡


第三步:进行测试

依次启动服务:

注册中心=>会员服务1=>会员服务2=>订单服务

(1)访问会员服务1

http://localhost:8762/getMenberAll

image.png

显示结果为,第一台会员服务的结果。

(2)访问会员服务2

http://localhost:8764/getMenberAll

image.png

显示结果为,第二台会员服务的结果。


(3)我们现在访问订单服务,进行远程调用这2台会员服务。

http://localhost:8763/getOrderMenberAll

image.png

远程调用指向的是会员服务1。

image.png

现在发现,我们远程调用服务变成指向会员服务2中了。

这是为什么呢?

因为这是你开启的负载均衡起到的作用,负载均衡默认的算法是每台服务访问一次,进行跳转下一台服务。当然,你也可以写自定义的负载均衡算法。

转载请注明来源:

评论