分布式系列~07.使用Maven统一管理RPC项目的资源,负载均衡
本文是上一篇文章的后续,详情点击该链接~
使用Maven统一管理RPC项目的资源
一个RPC项目包含服务提供者和服务消费者项目。使用Maven作为RPC项目的资源管理工具,对RPC项目的资源进行统一管 理。
Maven项目之间的关系:
依赖关系:
作用:
告诉Maven帮助我们导入第三方的资源
使用:
在当前项目的pom.xml文件中配置资源坐标
Maven项目之间的关系:
依赖关系:
作用:
告诉Maven帮助我们导入第三方的资源
使用:
创建pom类型的项目,在其pom.xml文件中声明公共资源坐 标。其他项目继承即可。
继承关系:
作用:
统一管理不同的项目之间的公共资源
使用:
在当前项目的pom.xml文件中配置资源坐标
聚合关系:
作用:
将一个功能拆分为不同的Maven的moudle项目,便于分别打 包,而不 是整个项目打包
使用:
创建一个pom类型的项目,并创建子Moudle
建立父子项目
父项目依赖
<?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.alvin</groupId>
<artifactId>parent</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>api</module>
<module>provide</module>
<module>customer</module>
</modules>
<!--继承SpringBoot项目-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.10.RELEASE</version>
</parent>
<!--配置要被管理的依赖-->
<dependencyManagement>
<dependencies>
<!--SpringBoot的启动器依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.1.10.RELEASE</version>
</dependency>
<!--web启动器的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.10.RELEASE</version>
</dependency>
<!--dubbo的依赖-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<!--zk的依赖-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.2.0</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
子项目继承父项目,导入所需依赖以及公共资源
公共资源:UserService
public interface UserService {
String showMsg(String str);
}
application.yml配置文件(提供者和消费者)
##配置Zookeeper的连接信息
dubbo:
application:
name: dubbo-provider
registry:
address: zookeeper://192.168.147.128:2181
##配置服务提供者的端口号
protocol:
port: 20880
提供者:UserServiceImpl
注意:service要导入dubbo而不是spring
import com.alvin.dubbo.service.UserService;
import org.apache.dubbo.config.annotation.Service;
@Service
public class UserServiceImpl implements UserService {
@Override
public String showMsg(String str) {
return "hello : " + str ;
}
}
消费者:Controller
import com.alvin.dubbo.service.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class CustomerController {
@Reference
private UserService userService;
@RequestMapping("demo")
@ResponseBody
public String showMsg(String show){
String s = userService.showMsg(show);
return s;
}
}
启动类
别忘了这个注释 : @EnableDubbo
@SpringBootApplication
@EnableDubbo
public class Customer {
public static void main(String[] args) {
SpringApplication.run(Customer.class,args);
}
}
启动的时候先启动提供者,再启动消费者
Dubbo内置的负载均衡策略
集群:一个服务,部署多次,形成的整体称为集群。集群中每个个体应该部署到不同的服务器上。并且链接集群中的任意节点都能获取到相同的服务。
伪集群:没有真实的电脑主机,通过模拟集群的特点来完成集群服务。
zookeeper集群负载均衡是在集群前提下,当访问整个集群时,集群中每个节点被访问次数或频率的规则。
Dubbo 内置了四个负载均衡策略。默认为Random
内置策略
Random
随机。随机访问集群中节点。访问概率和权重有关。
RoundRobin
轮询。访问频率和权重有关。
权重(weight):占有比例。集群中每个项目部署的服务器的性能可能是不同,性能好的服务器权重应该高一些。
LeastActive
活跃数相同的随机,不同的活跃数高的放前面。
ConsistentHash
一致性Hash。相同参数请求总是发到一个提供者。
Provider集群
新建四个启动类。每次启动启动类修改配置文件dubbo.protocal.port
设置负载均衡
我们直接从刚刚的代码基础上来做修改
配置文件
dubbo:
application:
name: dubbo-provider
registry:
address: zookeeper://192.168.147.128:2181
protocol:
port: 20884
provider:
loadbalance: random
consumer:
loadbalance: random
@Reference
调用的服务采用的负载均衡
@Controller
public class CustomerController {
@Reference(loadbalance = "roundrobin")
private UserService userService;
@Service
当前服务采用的负载均衡算法
@Service(loadbalance = "random")
public class UserServiceImpl implements UserService {