Spring Cloud做负载均衡

1.新建maven工程,点击finish完成

   

2.在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.lemon.test02</groupId>
    <artifactId>Service01</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/>
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</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>

3.创建服务注册中心server,新建一个module->Spring Initializer->Cloud Discovery->Eureka Server->finish

4.修改src/main/resources/application.properties为application.yml

5.在包下自动产生的MyServerApplication.java文件中添加@EnableEurakeServer,在application.yml文件中添加如下内容

server:
  port: 8801
eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
spring:
  application:
    name: eurka-server

6.启动工程,打开localhost:8801测试,出现下图,表明server正常工作

7.新建服务的module,名字为my-service,和server构建方式一模一样,然后修改my-service的pom.xml文件中的spring-cloud-starter-netflix-eureka-server为spring-cloud-starter-netflix-eureka-client,按照上文方式修改properties为yml

8.在my-service模块产生的java文件中添加如下内容

package com.example.myservice;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@EnableEurekaClient
@RestController
public class MyServiceApplication {

	public static void main(String[] args) {
		SpringApplication.run(MyServiceApplication.class, args);
	}
	@Value("${server.port}")
	String port;
	@RequestMapping("/hi")
	public String home(@RequestParam(value = "name",defaultValue = "lemon") String name){
		return "hi"+name+", I am on the port:"+port;
	}
}

在yml文件中添加

server:
  port: 8802
spring:
  application:
    name: service-ribbon
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8801/eureka/

启动程序测试,此时发现,在localhost:8801网页上,出现一个my-service的应用,在应用程序启动处选择Edit Configuration,去掉Single instance only,便可以修改端口号,再次启动一个服务,打开8801端口网页发现有两个服务

9.创建一个消费者module,名称为my-consume,创建方式和my-service一样,也修改文件为client,添加如下内容到yml文件

server:
  port: 8804
spring:
  application:
    name: my-consume
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8801/eureka/

添加如下内容到java文件中

package com.example.myconsume;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient //确保可以注册
public class MyConsumeApplication {

	public static void main(String[] args) {
		SpringApplication.run(MyConsumeApplication.class, args);
	}
	@Bean
	@LoadBalanced
	RestTemplate restTemplate() {
		return new RestTemplate();
	}
}

新建一个service文件,添加如下内容

package com.example.myconsume;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.client.RestTemplate;
@Service
public class HelloService {
    @Autowired
    RestTemplate restTemplate;

    public String hiService(String name) {
        return restTemplate.getForObject("http://MY-SERVICE/hi?name="+name,String.class);
    }
}//其中MY-SERVICE是服务的名称,在网页中可以查到

新建一个controller文件,添加如下内容

package com.example.myconsume;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloControler {
    @Autowired
    HelloService helloService;

    @RequestMapping(value = "/hi")
    public String hi(@RequestParam String name){
        return helloService.hiService(name);

    }

}

启动工程,发现在网页中该服务也注册了,如下图

在网页中输入localhost:8804/hi?name=lemon,不断刷新,发现打印出的端口号是改变的,说明进行负载均衡了

参考:https://blog.csdn.net/forezp/article/details/81040946

原文地址:https://www.cnblogs.com/SakerLiu/p/9743577.html

时间: 2024-11-08 18:53:34

Spring Cloud做负载均衡的相关文章

spring cloud 客户端负载均衡 - Ribbon

Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,基于Netflix Ribbon实现的,Ribbon不像注册中心.网关那样需要单独部署,它是作为一个工具直接集成到Service里.后面要讲到的Feign里面也集成了Ribbon. 1.手动搭建一个客户端负载均衡 准备工作: 准备一个由 peer1.peer2 构成的配置中心 准备一个由 service-1(8091).service-1(8092) 构成的服务端集群 准备一个Ribbon客户端 添加pom依赖

spring boot分布式技术,spring cloud,负载均衡,配置管理器

spring boot分布式的实现,使用spring cloud技术. 下边是我理解的spring cloud的核心技术: 1.配置服务器 2.注册发现服务器eureka(spring boot默认使用的服务器类别) 3.RestTemplate通过ribbon实现负载均衡技术 具体请看下列图: 参考:http://www.cnblogs.com/skyblog/p/5127690.html

spring cloud ribbon 负载均衡类1

Ribbon 在实现客户端负载均衡时,是通过Ribbo的ILoadBalancer接口实现的. AbstractLoadBalancer 是ILoadBalancer接口的抽象实现,定义了一个分组枚举类ServerGroup 还实现了一个chooseServer()方法,其中key为null,表示在选择具体实例时忽略key的条件判断 还定义了两个抽象方法 getServerList(ServerGroup serverGroup):根据分组类型获取不同的实例列表 getLoadBalancerS

客户端负载均衡Ribbon之一:Spring Cloud Netflix负载均衡组件Ribbon介绍

Netflix:['netfli?ks] ribbon:英[?r?b?n]美[?r?b?n]n. 带; 绶带; (打印机的) 色带; 带状物;v. 把…撕成条带; 用缎带装饰; 形成带状;     LB方案分类 目前主流的LB方案可分成两类: 一种是集中式LB, 即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至服务的提供方: 另一种是进程内LB,将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址

Spring Cloud Netflix负载均衡组件Ribbon介绍

Netflix:['netfli?ks] ribbon:英[?r?b?n]美[?r?b?n]n. 带; 绶带; (打印机的) 色带; 带状物;v. 把…撕成条带; 用缎带装饰; 形成带状;     LB方案分类 目前主流的LB方案可分成两类: 一种是集中式LB, 即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至服务的提供方: 另一种是进程内LB,将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址

Nginx做负载均衡时session共享问题详解

用nginx做负载均衡时,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态. 再者Nginx连接Memcached集群时,Nignx的请求从memcached服务器中根据key获得了value则直接返回value,如果没有获得到value则去MySQL中查询再返回. location / { set $memcached_key "$request_uri"; #设置请求memcached服务器的key memca

nginx tomcat做负载均衡

之前使用nginx做过web反向代理,没有做过负载均衡,今天有个同学需要做tomcat的负载均衡,我也研究下. 一共是2个机器,一个物理机(win7)上面部署2个tomcat,使用不同的端口启动.vm中的虚拟机放(centos)nginx,给tomcat做负载均衡. inux ip: 192.168.37.129 win ip: 192.168.37.1 首先保证两个主机可以互ping,响应的端口开放. nginx上使用80 tomcat1 使用8081 tomcat2使用8080 nginx,

Windows平台下利用APM来做负载均衡方案 - 负载均衡(下)

概述 我们在上一篇Windows平台分布式架构实践 - 负载均衡中讨论了Windows平台下通过NLB(Network Load Balancer) 来实现网站的负载均衡,并且通过压力测试演示了它的效果,可以说还是非常的理想的.同时我们也收集到了不少的问题,比如说如何在这种分布式的架构下使用Session,NLB中有一台服务器挂掉了会导致对外暴露的地址无法访问,如果实现服务器之间的同步,如果更好的进行热修复等等,还有我们在上一篇中也提到了NLB所提供的功能是非常简单的,为了回答我们前面提到的问题

mysql集群一:主从复制,通过mysql-proxy做负载均衡

mysql集群架构方式很多,根据不同的需求做不一样的架构,简单一点的就是mysql的replication,也就是Mysql的复制功能,模式有:master-slaves,master-slaves-slaves,master-master-slaves等可以有多个分层,那么现在我所要说的是master-slaves的模式(其他的模式原理基本都一样),然后再通过mysql官方提供的Mysql-proxy实现读写分离,达到负载均衡的效果. 环境: 主机:master:192.168.1.109,s