SpringBoot--12.分布式 dubbo+zookeeper+springboot

1.前驱技术

(1)分布式
(2)RPC
(3)SpringBoot

2.dubbo入门

(1)dubbo官网: dubbo官网
(2)工作原理图:在这里插入图片描述
服务提供者(Provider) :暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者(Consumer) : 调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
注册中心(Registry) :注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者.
监控中心(Monitor) :服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心
调用关系说明:

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

(3)dubbo-admin下载安装
1)首先
1)在官网下载下载地址,然后解压缩
2)使用maven命令打包(因为这是个maven项目且是springboot项目),同时记得改一下端口号,因为默认是8080,老是和tomcat冲突,我该为了7001

mvn clean package -D maven.test.skip=true

3)打包好jar包之后,使用命令运行它
在这里插入图片描述
4)然后访问localhost:7001就可以看到可视化界面了

(4)zookeeper环境搭建
1)下载zookeeper(一个注册中心):下载地址
2)解压后进入bin文件夹,双击运行zkServer.cmd文件,如果一闪而过,则在call的下一行加上pause查看错误原因
3)如果报错就进入conf目录下,复制一份simple-conf文件:并命名zoo.cfg在这里插入图片描述在这里插入图片描述
4)再次运行即可:打开客户端(zkCli.cmd),如果连接成功,则不会报错在这里插入图片描述
(5)springboot+dubbo+zookeeper
1)创建新的empty project
2)在新项目下创建两个model,springboot项目模拟provider和customer
在这里插入图片描述
3)为provider项目导入maven依赖

<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
        <!--zk服务端-->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.12.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.12.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.14</version>
            <!-- 避免日志冲突的包-->
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

4)配置文件基本信息

#服务端口
server.port=8001
#注册这个应用的名称
dubbo.application.name=provider-server
#注册中心的ip地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#需要注册的服务
dubbo.scan.base-packages=edu.ncu.dong.server

5)为provider项目创建自定义的服务
在这里插入图片描述

package edu.ncu.dong.server;
import org.apache.dubbo.config.annotation.Service;
@Service
//尽量不用Service注解,因为容易和spring的service注解搞混,用component注解也可以的
public class TicketsServiceImpl implements TicketsService{
    @Override
    public String soleTickets() {
        return "Hello i am dong li!";
    }
}

6)解释
因为这个服务有@Service注解,所以启动服务之后就会添加到注册中心,让zookeeper发现服务并添加到注册中心
7)验证
我们登录localhost:7001这个网址(就是dubbo-admin可视化页面),可以看到provider服务已经有了
在这里插入图片描述
8)同样地,我们为customer项目导入maven依赖(省略),并配置properties配置文件

#同理 端口号
server.port=8002
#消费者去注册中心拿取服务 需要暴露自己的名字
dubbo.application.name=customer-server
#注册中心的地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

9)编写customer项目的service类

package edu.ncu.dong.server;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;

@Service //这里要使用spring的@Service注解,因为我们想把它放入spring容器中,而不是注册中心
public class TicketService {
    //在provider服务中配置服务到了注册中心,那么这里就需要去注册中心取服务
    //使用@Reference注解(注意是dubbo包下的)
    @Reference
    TicketsService TICKETSSERVICE;
    public void getTickets(){
        System.out.println(TICKETSSERVICE.soleTickets());
        System.out.println("拿到了ticket");
    }
}

10)这里要注意@Reference注解,用于引用注册中心下的服务接口
虽然在注册中心下有provider服务,但是在customer包下并没有,有两种方法解决
1.定义与接口路径相同的接口名(包名也要和provider包相同),比如这里就从provider包下复制了TicketsService接口,注意并不需要定义实现类
在这里插入图片描述
编写测试类

@SpringBootTest
class CustomerApplicationTests {
    @Autowired
    TicketService ticketService;
    @Test
    void contextLoads() {
        ticketService.getTickets();
    }
}

在provider启动的前提下,启动customer服务,查看运行结果:得到了privider提供的String,且输出成功了
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值