dubbo+zookeeper

dubbo+zookeeper,第1张

dubbo+zookeeper

目录

一,背景及准备:

 1,Dubbo

2,RPC

3,dubbo和zookeeper的安装

 二,demo应用


一,背景及准备:

什么是分布式系统???在《分布式系统原理与范型》一书中有如下定义:“分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统”。这是最简洁明了的解释。

分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务。其目的是利用更多的机器,处理更多的数据。

分布式系统(distributed system)是建立在网络之上的软件系统。

首先需要明确的是,只有当单个节点的处理能力无法满足日益增长的计算、存储任务的时候,且硬件的提升(加内存、加磁盘、使用更好的CPU)高昂到得不偿失的时候,应用程序也不能进一步优化的时候,我们才需要考虑分布式系统。因为,分布式系统要解决的问题本身就是和单机系统一样的,而由于分布式系统多节点、通过网络通信的拓扑结构,会引入很多单机系统没有的问题,为了解决这些问题又会引入更多的机制、协议,带来更多的问题。。。应运而生Dubbo出现了。

1,Dubbo

下图展现的就是网站的演进过程!

 

 

 

2,RPC

我们还需要了解到RPC通信,Dubbo就是用的RPC通信在服务之间互相调用

Remote Procedure Call  远程过程调用  是一种进程间通信方式,他是一种技术的思想,而不是规范。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的函数,本质上编写的调用代码基本相同。生活上的案例,你想吃苹果,然后你去了楼下水果店买了水果,回到家洗洗吃,这就是本地调用;同样的你想吃苹果,在美团上购买了,骑手送到你手上,你洗洗吃了,这就是远程调用。RPC最核心的两个部分,通讯,序列化。

 推荐阅读文章:https://www.jianshu.com/p/2accc2840a1b

3,dubbo和zookeeper的安装

注意点:

1)在安装zk的时候注意zk的配置文件

a,修改zoo.cfg配置文件

b,将conf文件夹下面的zoo_sample.cfg复制一份改名为zoo.cfg即可。

c,注意几个重要位置:

4,dataDir=./   临时数据存储的目录(可写相对路径)

5,clientPort=2181   zookeeper的端口号

6,修改完成后再次启动zookeeper

2)GitHub - apache/dubbo-admin at master   下载dubbo-admin,有可视化页面

a,进入dubbo-adminsrcmainresources application.properties配置文件 指定zookeeper地址

server.port=7001
spring.velocity.cache=false
spring.velocity.charset=UTF-8
spring.velocity.layout-url=/templates/default.vm
spring.messages.fallback-to-system-locale=false
spring.messages.basename=i18n/message
spring.root.password=root
spring.guest.password=guest

dubbo.registry.address=zookeeper://127.0.0.1:2181

 b,在项目目录下打包dubbo-admin

 打包命令   mvn clean package -Dmaven.test.skip=true

 c,打包成功后去dubbo-admin的target目录下会有一个jar的可执行文件

 使用java -jar dubbo-admin-0.0.1-SNAPSHOT.jar执行。

d,访问localhost:7001  ,7001是默认的端口,可以在配置文件中修改的

 对于分布式的原理理解,很粗线,很表面,还需要更多的联系,应用。

 二,demo应用

1,新建两个module一个服务提供者,一个服务消费者

 2,在provide中准备服务

买票接口:

public interface TicketService {


    public String  getTicket();
}

接口的实现:

public class TicketServiceImpl implements TicketService {
    @Override
    public String getTicket() {
        return "im ticket to Lion go home";
    }
}

服务的提供者模型大致就这样。返回一个字符串。

3,既然服务提供者有了,那么就需要一个消费者来消费这个服务(就是调用这个服务,不然这个提供者就失去了意义)

在consumer-server中准备服务调用提供者

public class UserService {

    public void buyTicket(){
        //去拿票(调用提供者返回的字符串)
    }

}

现在出现问题了,我consumer怎么取拿到provider的服务呢?需要一个中间商zookeeper来从中调节。zookeeper是注册中心,用来管理服务的,我们只需要将provider给的服务注册到zookpeer中,然后consumer去zookpeer中去拿,就可以了

4,将provider注册到服务中心去。

a,引包



   org.apache.dubbo
   dubbo-spring-boot-starter
   2.7.3
  




   com.github.sgroschupf
   zkclient
   0.1
  



   org.apache.curator
   curator-framework
   2.12.0


   org.apache.curator
   curator-recipes
   2.12.0


   org.apache.zookeeper
   zookeeper
   3.4.14
   
   
       
           org.slf4j
           slf4j-log4j12
       
   

b,在provider的配置文件中添加配置参数

#当前应用名字
dubbo.application.name=provider-server
#注册中心地址--这里用的就是本地的zk,正式环境就换到服务器上的zk,改一下地址就行
dubbo.registry.address=zookeeper://127.0.0.1:2181
#扫描指定包下服务--非常重要,写的不对则扫描不到,就无法注册到zk当中
dubbo.scan.base-packages=com.example.service

c,服务接口完善

import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;

//注意上面引用的两个包

@Service   //这不是spring的service,是dubbo的  新版的这个注解变成了@DubboServoce  便于和spring的@Service区分开
@Component  //交给spring管理
public class TicketServiceImpl implements TicketService {
    @Override
    public String getTicket() {
        return "im ticket to Lion go home";
    }
}

以上,在provider-server启动的时候,服务就会被注册到zk,是以接口名注册的。

可以查看服务的所有信息

 服务提供者完善。

5,consumer-server注册到zk中

a,引包,和provider-server一样。

需要多增加一个依赖,巨坑

        
            org.apache.curator
            curator-x-discovery
            2.12.0
        

少了这个依赖就会报错org/apache/curator/x/discovery/ServiceDiscoveryBuilder巨坑

b,修改参数

#当前应用名字
dubbo.application.name=consumer-server
#注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

c,请求完善

import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service;



@Service//放到容器中  是spring的@Server
public class UserService {

    //这里要获得票,那么必须去注册中心拿
    @DubboReference
    TicketService ts;//两种方式Pom坐标可以定义路径相同的接口名(在pom文件中引入),或者定义相同路径的接口

    public void buTicket(){
        System.out.println(ts.getTicket());
    }


}

 

 

 以上,完善consumer-server,会被注册到zk中去。

可以在dubbo-admin中看见服务的信息,和provider一样。

d,测试

@SpringBootTest
class ConsumerServerApplicationTests {

    @Autowired
    UserService userService;
    @Test
    void contextLoads() {
        userService.buTicket();
    }
}

 纯属个人学习记录之后。有错请指正。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5676344.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存