Nginx反向代理实现多服务器负载均衡

配置nginx.conf

#负载均衡

upstream lagouServer{

# 用server定义 HTTP地址

server 192.168.52.100:8081;

server 192.168.52.100:8082;

}

server {

listen 80;

server_name www.lagouNB.com;

location / {

# 利用 proxy_ pass可以将请求代理到upstream命名的HTTP服务

proxy_pass http://lagouServer; #转发的地址

index index.html index.htm;

}

}

端口为80,访问Nginx所在服务器地址即可负载均衡到每一台Tomcat服务器

Zookeeper

原理: 其实就是Zookeeper上面有树状分支节点,我们可以创建很多的客户端,然后让指定客户端监听(zookeeper帮忙监听)某个节点,之后该节点发生变化(节点值改变、增加子节点。删除节点),则监听该节点的客户端就会收到信息并且执行process方法,Java中该方法在创建zookeeper客户端时执行一次,之后监听到节点变化都会执行

作用:

统一命名服务统一配置管理服务器节点动态上下线(美团外卖)软负载均衡

美团外卖:通过监控临时节点的变化

zoo.cfg配置多台服务器负载均衡(用于监听处理节点)

#######################cluster##########################

server.1=192.168.204.141:2888:3888

server.2=192.168.204.142:2888:3888

server.3=192.168.204.143:2888:3888

传统锁与分布式锁的区别

1.传统锁就是1000个线程抢占一个方法执行,被一个抢到后剩下999个就等待下一次轰抢(无序) 2.分布式锁就是有序排队,每个人都有一个编号,只有编号最小是下一次执行者

分布式锁-商品秒杀(解决高并发问题):

所有请求进来,在/lock下创建 临时顺序节点 ,放心,zookeeper会帮你编号排序判断自己是不是/lock下最小的节点是,获得锁(创建节点)否,对前面小我一级的节点进行监听获得锁请求,处理完业务逻辑,释放锁(删除节点),后一个节点得到通知(比你年轻的死了,你 成为最嫩的了)重复步骤2

使用方法:

使用apahce提供的zookeeper客户端Curator

配置Curator依赖

org.apache.curator

curator-recipes

4.2.0

在控制层中加入分布式锁的逻辑代码

@Controller

public class ProductAction {

@Autowired

private ProductService productService;

private static String connectString = "192.168.204.141:2181,192.168.204.142:2181,192.168.204.143:2181";

@GetMapping("/product/reduce")

@ResponseBody

public Object reduce( int id) throws Exception {

// 重试策略 (1000毫秒试1次,最多试3次)

RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);

//1.创建curator工具对象

CuratorFramework client = CuratorFrameworkFactory.newClient(connectString, retryPolicy);

client.start();

//2.根据工具对象创建“内部互斥锁”

InterProcessMutex lock = new InterProcessMutex(client, "/product_"+id);

try {

//3.加锁

lock.acquire();

productService.reduceStock(id);

}catch(Exception e){

if(e instanceof RuntimeException){

throw e;

}

}finally{

//4.释放锁

lock.release();

}

return "ok";

}

}

Dubbo+Zookeeper的RPC分布式架构

调用关系

1.服务容器负责启动,加载,运行服务提供者; 2.服务提供者在启动时,向注册中心注册自己提供的服务; 3.服务消费者在启动时,向注册中心订阅自己所需的服务; 4.在注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给 消费者; 5.服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败, 再选另一台调用; 6.服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中 心;

使用依赖(严格按照)

war

5.0.6.RELEASE

org.springframework

spring-webmvc

${spring.version}

org.springframework

spring-core

${spring.version}

org.springframework

spring-beans

${spring.version}

org.springframework

spring-context

${spring.version}

org.springframework

spring-context-support

${spring.version}

org.springframework

spring-tx

${spring.version}

com.alibaba

dubbo

2.5.7

org.apache.zookeeper

zookeeper

3.4.6

com.github.sgroschupf

zkclient

0.1

javassist

javassist

3.11.0.GA

org.apache.tomcat.maven

tomcat7-maven-plugin

8001

/

package

run

Spring配置

常用配置说明

启动时检查超时时间重试次数多版本本地存根负载均衡策略(测试方法:直接修改Tomcat和provider端口号启动。因为都注册在同一个Zookeeper)高可用(zookeeper宕机)服务降级(是防止分布式服务发生雪崩效应)

注意和理解: 服务者中的@Service为import com.alibaba.dubbo.config.annotation.Service;通过spring配置注册到zookeeper

消费者通过@Reference(远程去服务方将service的实现类注入进来)和zookeeper调用到服务者中的实现类方法

分布式即开发中把查询,修改等service层功能模块部署到不同的服务器上面,然后通过这种方式进行远程调用,缓解单个服务器压力

参考阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: