服务发现 —— ServiceLoader

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了服务发现 —— ServiceLoader相关的知识,希望对你有一定的参考价值。

在java开发中,有一些这样的场景:
           
项目中加入了某些jar包,编译时也没有错,但运行时就报错了,
找不到类——这其实就涉及到java中面向接口编程。
            大家都知道面向接口开发有很多好处,特别是在java中要实现回调这样的功能,
        你还必须使用接口。面向接口开发中涉及两个要部分:接口(定义)和接口的实现,
         在有些情况下,接口的定义与实现并不在同一个项目中,或者接口定义方跟实现方式分属不同组织,
         这时候我们要使用这一类接口所拥有的功能时,就需要加入两部分依赖:接口定义部分jar包及
         该接口的实现jar包,这就是开始提出问题的答案。
         
 其实java开发中这样的场景比较多:JDBC、JPA、JMS、WebSocket等都是接口定义方与实现方分离,
 不属于同一个组织,java方一般都是规范的定义者。

 开发中经常遇到这样的事,但是你有没有问过自己:定义接口的jar包与实现jar包加入项目后,
 java在运行时是如何将二者关联起来的,他怎么知道谁是谁的实现呢?
     
    有人可能说这还不简单,直接将所有项目jar包扫描一遍不就知道了!?  
    没错,这办法行得通,但是想想都觉得麻烦,效率不高,其实java研发者在1.6的时候就加入了
    一个实现这种需求的类——ServiceLoader,这就是服务发现功能。
    
    服务发现功能约定:
    
       1、服务实现方必须在自己提供的jar包中的META-INF目录下放置一个目录,
           名字就叫services
            
       2、在services目录下放置服务接口类与实现类的关系文件,该文件要求:
            a、文件的名字是被实现的接口的全路径名(如:a.b.c.IHeHe),文件没有后缀,
               每个文件代表一个接口。
            b、文件内容是该文件名字所代表的接口的实现类的全路径名
                 (如:x.y.x.HaHa ,HaHa实现了IHeHe接口),
               如果该接口有多个实现类,则每个实现类占一行。
   
     这里给一个小的demo,借用一下网友的例子:
     http://blog.csdn.net/is_zhoufeng/article/details/50722440




          

以上是关于服务发现 —— ServiceLoader的主要内容,如果未能解决你的问题,请参考以下文章

简单说说服务治理之服务注册和发现

springcloud服务注册和发现

Nacos服务注册与发现的原理

微服务架构下的服务发现功能

服务发现的基础概念

有赞服务注册与发现架构演进