27.1 简介

  1. 一个服务称为一个模块,一个模块由modid+cmdid来标识<br />modid+cmdid的组合表示一个远程服务,这个远程服务一般部署在多个节点上

LB Agent以UDP方式为业务方提供:1、节点获取服务;2、节点调用结果上报服务

27.1.1 业务1-节点获取服务:

  1. 业务方每次要向远程服务发送消息时,先利用modid+cmdid去向LB Agent获取一个可用节点,然后向该节点发送消息,完成一次远程调用;具体获取modid+cmdid下的哪个节点是由LB Agent负责的

27.1.2 业务2-节点调用结果上报服务

  1. LB Agent节点的一次远程调用后,调用结果会汇报给LB Agent,以便LB Agent根据自身的LB算法来感知远程服务节点的状态是空闲还是过载,进而控制节点获取时的节点调度.<br />![4-Lars-agent.png](https://cdn.nlark.com/yuque/0/2022/png/26269664/1650258826825-5e615228-9135-4a62-8016-e35943119eb7.png#clientId=u43bc1095-8225-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=uf8301d98&margin=%5Bobject%20Object%5D&name=4-Lars-agent.png&originHeight=571&originWidth=1172&originalType=binary&ratio=1&rotation=0&showTitle=false&size=140028&status=done&style=none&taskId=u3c26bd2f-1532-4eb3-a14b-6c4441a239b&title=)

LB Agent拥有5个线程,一个LB算法:

UDP Server服务,并运行LB算法,对业务提供节点获取和节点调用结果上报服务;为了增大系统吞吐量,使用3个UDP Server服务互相独立运行LB算法:modid+cmdid % 3 = i的那些模块的服务与调度,由第i+1个UDP Server线程负责

Dns Service Client:是dnsserver的客户端线程,负责根据需要,向dnsserver获取一个模块的节点集合(或称为获取路由);UDP Server会按需向此线程的MQ写入获取路由请求,DSS Client将MQ到来的请求转发到dnsserver,之后将dnsserver返回的路由信息更新到对应的UDP Server线程维护的路由信息中

Report Service Client:是reporter的客户端线程,负责将每个模块下所有节点在一段时间内的调用结果、过载情况上报到reporter Service端,便于观察情况、做报警;本身消费MQ数据,UDP Server会按需向MQ写入上报状态请求。

27.2构建Lars-Agent项目

27.2.1 构建目录结构

依次创建如下目录:

Lars/lars_loadbalance_agent

  1. lars_loadbalance_agent/
  2. ├── bin/
  3. ├── conf/
  4. └── lars_lb_agent.conf
  5. ├── include/
  6. ├── Makefile
  7. └── src/

其中Makefile如下:

  1. TARGET= bin/lars_lb_agent
  2. CXX=g++
  3. CFLAGS=-g -O2 -Wall -Wno-deprecated
  4. BASE=../base
  5. BASE_H=$(BASE)/include
  6. PROTO = $(BASE)/proto
  7. PROTO_H = $(BASE)/proto
  8. LARS_REACTOR=../lars_reactor
  9. LARS_REACTOR_H =$(LARS_REACTOR)/include
  10. LARS_REACTOR_LIB=$(LARS_REACTOR)/lib -llreactor
  11. MYSQL=$(BASE)/mysql-connector-c
  12. MYSQL_H=$(MYSQL)/include
  13. MYSQL_LIB=$(MYSQL)/lib/libmysqlclient.a
  14. OTHER_LIB = -lpthread -ldl -lprotobuf
  15. SRC= ./src
  16. INC= -I./include -I$(BASE_H) -I$(LARS_REACTOR_H) -I$(MYSQL_H) -I$(PROTO_H)
  17. LIB= $(MYSQL_LIB) -L$(LARS_REACTOR_LIB) $(OTHER_LIB)
  18. OBJS = $(addsuffix .o, $(basename $(wildcard $(SRC)/*.cpp)))
  19. OBJS += $(PROTO)/lars.pb.o
  20. $(TARGET): $(OBJS)
  21. mkdir -p bin
  22. $(CXX) $(CFLAGS) -o $(TARGET) $(OBJS) $(INC) $(LIB)
  23. %.o: %.cpp
  24. $(CXX) $(CFLAGS) -c -o $@ $< $(INC)
  25. .PHONY: clean
  26. clean:
  27. -rm -f src/*.o $(PROTO)/lars.pb.o $(TARGET)
  1. 实际上reporterdns相似。

conf/lars_lb_agent.conf

  1. [reporter]
  2. ip = 127.0.0.1
  3. port = 7779
  4. [dnsserver]
  5. ip = 127.0.0.1
  6. port = 7778
  1. 目前的基本配置文件,因为loadbalance_agent是充当reporterdnsserver的客户端,所以需要知道对应的reporterdnsserveripport信息。