Dubbo02

发布时间 2023-06-20 20:01:04作者: 加包辣条多放辣椒

1.Dubbo的注册中心Registry

1.1 什么是注册中心

  • 服务管理,核心是有个服务注册表,心跳机制动态维护
  • 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接(心跳机 制)推送变更数据给消费者
  • 微服务应用和机器越来越多,调用方需要知道接口的网络地址,如果靠配置文件的方式去控 制网络地址,对于动态新增机器,维护带来很大问题

1.2. Dubbo中常见的注册中心有哪些

  • Multicast

Multicast注册中心不需要启动任何中心节点,只要广播地址一样,就可以互相发现,组播受 网络结构限制,只适合小规模应用或开发阶段使用

  • Zookeeper

Zookeeper是Apacahe Hadoop的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo服务的注册中心,工业强度较高, 可用于生产环境,并推荐使用

  • Redis

Redis是一个高效的KV存储服务器,阿里内部并没有采用Redis做为注册中心,而是使用自己 实现的基于数据库的注册中心

  • Simple

注册中心本身就是一个普通的Dubbo服务,可以减少第三方依赖,使整体通讯方式一致。 只是简单实现,不支持集群,可作为自定义注册中心的参考,但不适合直接用于生产环境

  • 综合以上原因我们选择zookeeper作为dubbo的注册中心。

2.Dubbo+Zookeeper实现分布式

2.1. 创建provider工程

2.1.1. 创建Springboot工程

2.1.2. 引入相关依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.2.0</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.zookeeper</groupId>
                    <artifactId>zookeeper</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.7.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-x-discovery</artifactId>
            <version>4.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.lanou</groupId>
            <artifactId>service-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

2.1.3. 编写配置文件

server:
  port: 8083
dubbo:
  application:
    name: provider
  registry: 
    protocol: zookeeper
    address: 196.19.107.239:2181
    timeout: 60000 
  scan:
    base-packages: com.test.service
  protocol:
    name: dubbo
    port: 20883

2.1.4. 编写service的实现类

@DubboService
public class UserServiceImpl implements IUserService {
    @Override
    public String getAll() {
        return "Hello dubbo+zookeeper";
    }
}

2.1.5. 启动类添加注解

@EnableDubbo
@SpringBootApplication
public class CDubbo02ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(CDubbo02ConsumerApplication.class, args);
    }
}

2.2. 创建consumer工程

2.2.1. 创建Springboot工程

2.2.2. 引入依赖

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.2.0</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.zookeeper</groupId>
                    <artifactId>zookeeper</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.7.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-x-discovery</artifactId>
            <version>4.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.lanou</groupId>
            <artifactId>service-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

2.2.3. 编写配置文件

server:
  port: 8084
dubbo:
  application:
    name: consumer
  registry:
    protocol: zookeeper
    address: 196.19.107.239:2181
    timeout: 60000
  scan:
    base-packages: com.test.service

2.2.4. 编写controller类

@RestController
public class UserController {
    @DubboReference
    private IUserService userService;

    @RequestMapping("/getAll")
    public String getAll() {
        return userService.getAll();
    }
}

2.2.5. 启动类添加注解

@EnableDubbo
@SpringBootApplication
public class CDubbo02ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(CDubbo02ConsumerApplication.class, args);
    }
}

分别启动provider工程和consumer工程

3.设置Dubbo的重试次数和超时时间

provider

//设置Dubbo的重试次数和超时时间
@DubboService(retries = 3,timeout = 60000,cluster = "failsafe")
public class UserServiceImpl implements IUserService {
    @Override
    public String getAll() {
        return "Hello dubbo+zookeeper";
    }
}

consumer

//设置Dubbo的重试次数和超时时间
@RestController
public class UserController {
    //retries : 重试次数,默认重试2次
    //timeout : 超时时间
    //cluster = "failsafe" : 如果有报错,则忽略掉异常
    @Reference(retries = 3,timeout = 2000,cluster = "failsafe")
    private IUserService userService;
    @RequestMapping("/getAll")
    public String getAll() {
        return userService.getAll();
    }
}

注意:在代码中设置超时时间在高版本中会失效

4.设置Dubbo的负载均衡策略

4.1.负载均衡策略

4.1.负载均衡策略

定义:在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比 较均匀,有利于动态调整提供者权重。

4.1.2.RoundRobin LoadBalance 轮循,按公约后的权重设置轮循比率

定义:存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二 台时就卡在那,久而久之,所有请求都卡在调到第二台上。

4.1.3.LeastActive LoadBalance 最少活跃调用数

定义:使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

4.1.4.ConsistentHash LoadBalance 一致性Hash策略

定义:当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供 者,不会引起剧烈变动。

4.2. 启动第一个provider

server:
  port: 8081
dubbo:
  application:
    name: provider
  registry: # zookeeper注册
    protocol: zookeeper
    address: 196.19.107.239:2181
    timeout: 60000 #连接超时时间
  scan:
    base-packages: com.test.service
  protocol:
    name: dubbo
    port: 20881
  provider:
    loadbalance: random # 设置负载均衡策略,策略为权重随机
    weight: 1 # 设置权重为1,比如访问4次,其中1次访问此服务
@DubboService
public class UserServiceImpl implements IUserService {
	@Override
	public String getAll() {
		return "Hello dubbo+zookeeper8081";
	}
}

4.3. 启动第二个provider

server:
  port: 8081
dubbo:
  application:
    name: provider
  registry: # zookeeper注册
    protocol: zookeeper
    address: 196.19.107.239:2181
    timeout: 60000 #连接超时时间
  scan:
    base-packages: com.test.service
  protocol:
    name: dubbo
    port: 20881
  provider:
    loadbalance: random # 设置负载均衡策略,策略为权重随机
    weight: 3 # 设置权重为1,比如访问4次,其中3次访问此服务
@DubboService
public class UserServiceImpl implements IUserService {
    @Override
	public String getAll() {
    	return "Hello dubbo+zookeeper8082";
    }
}

4.4. 在浏览器进行测试

第一次访问

image

第二次访问

image

第三次访问

image

第四次访问

image

5.配置Dubbo-admin管理的图形化控制台

Dubbo-admin图形化控制台,可以实现通过图形化界面查看保存在zookeeper注册中心中的服 务提供方信息和服务消费方信息。

  • 把war文件放到 tomcat webapps下面 启动tomcat 报错不管 启动起来关闭就行
  • 修改dubbo-admin\WEB-INF 下面的dubbo.properties文件 ip地址改成自己zk的ip

image

重新启动tomcat,输入账号和密码(都是root)