发明内容
有鉴于此,本发明提供一种服务注册方法及Pod,以解决使用非Java语言开发的微服务不能在Eureka中注册,使得非Java语言开发的微服务不能被正常使用的问题。
为解决上述技术问题,本发明采用了如下技术方案:
一种服务注册方法,应用于容器组合Pod,所述Pod中部署有Agent容器和微服务容器,所述Agent容器中部署有能够调用目标注册中心的服务注册接口的Agent程序;所述微服务容器部署有使用预设开发语言开发、且需要进行服务注册的微服务;所述Agent容器预先设置有所述微服务对应的服务注册参数;所述微服务容器预先设置有所述Agent程序的Agent代理地址;
所述服务注册方法包括:
所述Agent程序在所述Pod响应启动指令时,获取所述微服务对应的服务注册参数以及所述Pod的Pod地址;所述服务注册参数包括微服务参数以及注册中心地址;
所述Agent程序调用所述服务注册接口,并将所述Pod地址以及所述微服务参数通过所述服务注册接口发送到所述注册中心地址对应的目标注册中心,以使所述目标注册中心保存所述Pod地址以及所述微服务参数,实现所述微服务的注册。
可选地,所述Agent程序将所述Pod地址以及所述微服务参数通过所述服务注册接口发送到所述注册中心地址对应的目标注册中心,以使所述目标注册中心保存所述Pod地址以及所述微服务参数,实现所述微服务的注册之后,还包括:
所述Agent程序每隔固定时间发送心跳信息至所述目标注册中心。
可选地,所述Agent程序将所述Pod地址以及所述微服务参数通过所述服务注册接口发送到所述注册中心地址对应的目标注册中心,以使所述目标注册中心保存所述Pod地址以及所述微服务参数,实现所述微服务的注册之后,还包括:
所述微服务发送服务请求至所述Agent程序;所述服务请求包括请求服务名称、请求服务内容以及访问地址;
所述Agent程序确定出所述请求服务名称对应的目标服务、所述目标服务对应的Pod地址以及所述Pod地址中的服务端口;
所述Agent程序生成包括所述请求服务内容、所述访问地址、所述目标服务对应的Pod地址以及所述Pod地址中的服务端口的服务访问请求,并将所述服务访问请求发送至所述目标服务对应的Pod地址中的服务端口,以使所述目标服务提供所述请求服务内容对应的服务。
可选地,所述Agent程序确定出所述请求服务名称对应的目标服务、所述目标服务对应的Pod地址以及所述Pod地址中的服务端口,包括:
获取在所述目标注册中心注册的服务列表信息;所述服务列表信息包括每一服务的服务名称、所述服务名称对应的Pod地址以及所述Pod地址中的服务端口;
依据所述服务列表信息,确定出所述请求服务名称对应的目标服务、所述目标服务对应的Pod地址以及所述Pod地址中的服务端口。
可选地,获取在所述目标注册中心注册的服务列表信息,包括:
向所述目标注册中心发送服务列表信息获取请求,并接收所述目标注册中心返回的服务列表信息。
一种容器组合Pod,所述Pod中部署有Agent容器和微服务容器,所述Agent容器中部署有能够调用目标注册中心的服务注册接口的Agent程序;所述微服务容器部署有使用预设开发语言开发、且需要进行服务注册的微服务;所述Agent容器预先设置有所述微服务对应的服务注册参数;所述微服务容器预先设置有所述Agent程序的Agent代理地址;
所述Pod被配置成:
所述Agent程序在所述Pod响应启动指令时,获取所述微服务对应的服务注册参数以及所述Pod的Pod地址;所述服务注册参数包括微服务参数以及注册中心地址;
所述Agent程序调用所述服务注册接口,并将所述Pod地址以及所述微服务参数通过所述服务注册接口发送到所述注册中心地址对应的目标注册中心,以使所述目标注册中心保存所述Pod地址以及所述微服务参数,实现所述微服务的注册。
可选地,所述Agent程序还用于:每隔固定时间发送心跳信息至所述目标注册中心。
可选地,所述微服务还用于发送服务请求至所述Agent程序;所述服务请求包括请求服务名称、请求服务内容以及访问地址;
所述Agent程序还用于:确定出所述请求服务名称对应的目标服务、所述目标服务对应的Pod地址以及所述Pod地址中的服务端口;
生成包括所述请求服务内容、所述访问地址、所述目标服务对应的Pod地址以及所述Pod地址中的服务端口的服务访问请求,并将所述服务访问请求发送至所述目标服务对应的Pod地址中的服务端口,以使所述目标服务提供所述请求服务内容对应的服务。
可选地,所述Agent程序用于确定出所述请求服务名称对应的目标服务、所述目标服务对应的Pod地址以及所述Pod地址中的服务端口时,具体用于:
获取在所述目标注册中心注册的服务列表信息;所述服务列表信息包括每一服务的服务名称、所述服务名称对应的Pod地址以及所述Pod地址中的服务端口;
依据所述服务列表信息,确定出所述请求服务名称对应的目标服务、所述目标服务对应的Pod地址以及所述Pod地址中的服务端口。
可选地,所述Agent程序用于获取在所述目标注册中心注册的服务列表信息时,具体用于:
向所述目标注册中心发送服务列表信息获取请求,并接收所述目标注册中心返回的服务列表信息。
相较于现有技术,本发明具有以下有益效果:
本发明提供了一种服务注册方法及Pod,所述Agent容器与微服务容器部署在同一个Pod中,进而两个容器能够进行本地通信,以及通过同一IP地址对外通信,保证了微服务的正常通信。在微服务能够正常通信的基础上,所述Agent容器中部署有能够调用目标注册中心的服务注册接口的Agent程序,进而微服务能够通过Agent程序进行微服务的注册,即本发明通过Agent容器中的Agent程序间接实现微服务的注册,使得使用非Java语言开发的微服务也能够在Eureka中进行注册,保证使用非Java语言开发的微服务的正常使用。进一步的,本发明中,通过设置Agent程序间接实现微服务的注册,不需要对微服务进行调整,相比于对微服务添加注册程序的方式来说,简化了对微服务的操作。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
Eureka基于java语言开发,并且Eureka所在的平台设置有支持使用Java语言开发的微服务进行服务注册的底层程序,使得使用Java语言开发的微服务通过配置文件就可以实现服务注册。但对于使用非Java语言开发的微服务,Eureka所在的平台并未设置有对应的用于进行服务注册的底层程序,导致使用非Java语言开发的微服务不能在Eureka中注册,进而使得非Java语言开发的微服务不能被正常使用。
发明人经过研究发现,若是在微服务的程序中添加注册程序,该注册程序能够调用Eureka的服务注册接口,就能够实现微服务的注册。但是这样的话,在微服务的数量较多的情况下,需要对每一个微服务的程序均做改进,操作复杂。
进一步的,发明人发现,若是能够编写一个Agent(代理程序)程序,该Agent程序能够调用目标注册中心的服务注册接口,通过Agent程序来间接实现微服务的注册,就不需要对微服务的程序添加注册程序,操作简单。并且,编写的Agent程序能够适用于多个微服务,能够简化多个微服务的注册操作,实现一次编写,适用多个微服务的技术效果。
具体的,本发明实施例中,所述Agent容器与微服务容器部署在同一个Pod(在Kubernetes集群中,Pod是所有业务类型的基础,它是一个或多个容器的组合)中,进而两个容器能够进行本地通信,以及通过同一IP地址对外通信,保证了微服务的正常通信。在微服务能够正常通信的基础上,所述Agent容器中部署有能够调用目标注册中心的服务注册接口的Agent程序,进而微服务能够通过Agent程序进行微服务的注册,即本发明通过Agent容器中的Agent程序间接实现微服务的注册,使得使用非Java语言开发的微服务也能够在Eureka中进行注册,保证使用非Java语言开发的微服务的正常使用。进一步的,本发明中,通过设置Agent程序间接实现微服务的注册,不需要对微服务进行调整,相比于对微服务添加注册程序的方式来说,简化了对微服务的操作。
在上述内容的基础上,本发明实施例提供了一种服务注册方法。应用于容器组合Pod。在实际应用中,所述Pod中部署有Agent容器和微服务容器,所述Agent容器中部署有能够调用目标注册中心的服务注册接口的Agent程序;所述微服务容器部署有使用预设开发语言开发(如非java语言)、且需要进行服务注册的微服务。
本实施例中,使用Deployment来创建Pod,以及用来管理Pod的生命周期等。然后通过Kubernetes(容器集群管理软件)将Agent程序和微服务部署到同一个Pod中,使得Agent程序和微服务能够本地通信,并且共享网络,使用同一个IP地址对外通信,即将Agent程序和微服务作为了一个整体,微服务实现了服务提供,Agent程序实现了微服务的对外通信。所述微服务容器预先设置有所述Agent程序的Agent代理地址。具体的,在应用容器,即微服务容器里面通过环境变量设置HTTP_PROXY(Agent代理地址)。该Agent代理地址是后续访问微服务的通信地址,Agent通过微服务名称找到Pod地址,通过该Pod地址,能够访问到微服务。其中,环境变量设置过程为:
env:
-name:HTTP_PROXY
value:'127.0.0.1:30000
所述Agent容器预先设置有所述微服务对应的服务注册参数,具体的,在Agent容器里面通过环境变量配置EUREKA_ENDPOINT(注册中心地址)、SERVICE_NAME(服务名称)、SERVICE_PORT(服务端口)。其中,服务名称和服务端口为微服务对应的服务注册参数。通过上述的Agent代理地址访问微服务,微服务通过Pod地址和服务端口对外提供服务。
需要说明的是,一个微服务容器与一个Agent容器设置在一个Pod中,另一个微服务容器与其匹配的Agent容器设置在一个Pod中,即同一个Pod中,仅设置一个微服务容器与一个Agent容器。
在上述内容的基础上,参照图1,本发明中的服务注册方法包括:
S11、所述Agent程序在所述Pod响应启动指令时,获取所述微服务对应的服务注册参数以及所述Pod的Pod地址。
在实际应用中,Pod中设置有程序,程序中设置有启动指令,在Pod第一次启动时,会运行该程序,并响应该程序中的启动指令,此时,Agent程序就会向目标注册中心注册微服务。
具体的,Agent程序获取预先设置有所述微服务对应的服务注册参数,以及为该Pod分配的Pod地址。所述服务注册参数包括上述的微服务参数以及注册中心地址。微服务参数包括上述的服务名称和服务端口,注册中心地址即为上述的注册中心地址。
S12、所述Agent程序调用所述服务注册接口,并将所述Pod地址以及所述微服务参数通过所述服务注册接口发送到所述注册中心地址对应的目标注册中心,以使所述目标注册中心保存所述Pod地址以及所述微服务参数,实现所述微服务的注册。
Agent程序在获取到所述Pod地址以及所述微服务参数之后,会调用服务注册接口,通过该接口将获取的数据发送至注册中心地址对应的目标注册中心,所述目标注册中心保存所述Pod地址以及所述微服务参数,实现所述微服务的注册。并在成功注册后,返回成功注册信息至Agent程序。
更具体的,Agent程序读取环境变量,把Pod地址、服务名称、服务端口注册到注册中心,注册中心保存服务名称与Pod地址和端口关系。在完成注册之后,所述Agent程序每隔固定时间发送心跳信息至所述目标注册中心。
具体的,Agent定时发送心跳到注册中心,使目标注册中心知道应用,即微服务是否正常运行、发送应用运行状态(UP表示运行,DOWN表示未运行)和当前时间。
本实施例中,Eureka本身提供服务注册功能,Agent程序会访问eureka提供接口,简化其他语言程序对接eureka开发。具体的,所述Agent容器与微服务容器部署在同一个Pod中,进而两个容器能够进行本地通信,以及通过同一IP地址对外通信,保证了微服务的正常通信。在微服务能够正常通信的基础上,所述Agent容器中部署有能够调用目标注册中心的服务注册接口的Agent程序,进而微服务能够通过Agent程序进行微服务的注册,即本发明通过Agent容器中的Agent程序间接实现微服务的注册,使得使用非Java语言开发的微服务也能够在Eureka中进行注册,保证使用非Java语言开发的微服务的正常使用。进一步的,本发明中,通过设置Agent程序间接实现微服务的注册,不需要对微服务进行调整,相比于对微服务添加注册程序的方式来说,简化了对微服务的操作。更进一步的,本发明中,编写完Agent程序后,可以将该Agent程序应用到多个微服务中,达到一次编写,多次使用的效果。
上述实施例介绍了微服务的注册过程,在实际应用中,在微服务注册之后,还能够提供服务。具体的,参照图2,在步骤S12之后,还包括:
S21、所述微服务发送服务请求至所述Agent程序。
在实际应用中,一个微服务可能会调用另一个微服务,如一个微服务是购物软件,另一个微服务是订单服务,若是用户点开购物软件后,想要访问自己的订单,此时需要购物软件调用订单服务软件,进而购物软件通过HTTP代理方式访问与该购物软件处于同一Pod中的Agent程序,此时购物软件就会发送服务请求至该Agent程序。
所述服务请求包括请求服务名称、请求服务内容以及访问地址。其中,请求服务名称可以是上述的订单服务,请求服务内容可以是查询历史订单,访问地址是URL中的访问地址。
S22、所述Agent程序确定出所述请求服务名称对应的目标服务、所述目标服务对应的Pod地址以及所述Pod地址中的服务端口。
在实际应用中,Agent程序会从自身存储的服务列表信息中查询得到所述请求服务名称对应的目标服务、所述目标服务对应的Pod地址以及所述Pod地址中的服务端口。
更具体的,参照图3,步骤S22可以包括:
S31、获取在所述目标注册中心注册的服务列表信息。
在实际应用中,Agent程序会向所述目标注册中心发送服务列表信息获取请求,并接收所述目标注册中心返回的服务列表信息。
所述服务列表信息包括每一服务的服务名称、所述服务名称对应的Pod地址以及所述Pod地址中的服务端口。
具体的,目标注册中心在接收到Agent程序发送的微服务的注册信息(微服务对应的服务注册参数以及所述Pod的Pod地址)之后,会将该注册信息保存到服务列表信息中,进而使得服务列表信息中包括各个微服务的注册信息。
Agent程序能够与目标注册中心通信,向所述目标注册中心发送服务列表信息获取请求,目标注册中心接收到服务列表信息获取请求之后,会返回服务列表信息至Agent程序,Agent程序保存该服务列表信息在内存中。
S32、依据所述服务列表信息,确定出所述请求服务名称对应的目标服务、所述目标服务对应的Pod地址以及所述Pod地址中的服务端口。
具体的,服务列表信息中包括各个微服务的注册信息,Agent程序直接依据请求服务名称来查询服务列表信息,得到该请求服务名称对应的目标服务、所述目标服务对应的Pod地址以及所述Pod地址中的服务端口。
S23、所述Agent程序生成包括所述请求服务内容、所述访问地址、所述目标服务对应的Pod地址以及所述Pod地址中的服务端口的服务访问请求,并将所述服务访问请求发送至所述目标服务对应的Pod地址中的服务端口,以使所述目标服务提供所述请求服务内容对应的服务。
Agent程序在获取到所述目标服务对应的Pod地址以及所述Pod地址中的服务端口之后,会生成包括所述请求服务内容、所述访问地址、所述目标服务对应的Pod地址以及所述Pod地址中的服务端口的服务访问请求,即URL请求,然后将该URL请求发送至目标服务对应的Pod地址中的服务端口,通过该服务端口找到微服务,进而使该微服务提供该请求的服务内容对应的服务。仍以上述实施例为例,此时订单服务提供历史订单信息至购物软件,以使购物软件将该历史订单信息反馈给用户。
本实施例中,应用发送请求给Agent,Agent接收请求,Agent转发请求到服务提供者,在实际应用中,服务提供者可能有多个,但每次请求只请求其中一个,则Agent在接收到应用请求之后,根据服务名称找到对应的Pod地址和端口,在多个信息中随机选择一个实例,Agent发送请求到服务提供者。以使服务提供者提供服务。
综上所述,参照图4,Agent容器中的Agent程序能够实现微服务(应用)的注册、发送心跳以及读取服务等功能。
可选地,在上述服务注册方法的实施例的基础上,本发明的另一实施例提供了一种容器组合Pod,所述Pod中部署有Agent容器和微服务容器,所述Agent容器中部署有能够调用目标注册中心的服务注册接口的Agent程序;所述微服务容器部署有使用预设开发语言开发、且需要进行服务注册的微服务;所述Agent容器预先设置有所述微服务对应的服务注册参数;所述微服务容器预先设置有所述Agent程序的Agent代理地址;
所述Pod被配置成:
所述Agent程序在所述Pod响应启动指令时,获取所述微服务对应的服务注册参数以及所述Pod的Pod地址;所述服务注册参数包括微服务参数以及注册中心地址;
所述Agent程序调用所述服务注册接口,并将所述Pod地址以及所述微服务参数通过所述服务注册接口发送到所述注册中心地址对应的目标注册中心,以使所述目标注册中心保存所述Pod地址以及所述微服务参数,实现所述微服务的注册。
进一步,所述Agent程序还用于:每隔固定时间发送心跳信息至所述目标注册中心。
进一步,所述微服务还用于发送服务请求至所述Agent程序;所述服务请求包括请求服务名称、请求服务内容以及访问地址;
所述Agent程序还用于:确定出所述请求服务名称对应的目标服务、所述目标服务对应的Pod地址以及所述Pod地址中的服务端口;
生成包括所述请求服务内容、所述访问地址、所述目标服务对应的Pod地址以及所述Pod地址中的服务端口的服务访问请求,并将所述服务访问请求发送至所述目标服务对应的Pod地址中的服务端口,以使所述目标服务提供所述请求服务内容对应的服务。
进一步,所述Agent程序用于确定出所述请求服务名称对应的目标服务、所述目标服务对应的Pod地址以及所述Pod地址中的服务端口时,具体用于:
获取在所述目标注册中心注册的服务列表信息;所述服务列表信息包括每一服务的服务名称、所述服务名称对应的Pod地址以及所述Pod地址中的服务端口;
依据所述服务列表信息,确定出所述请求服务名称对应的目标服务、所述目标服务对应的Pod地址以及所述Pod地址中的服务端口。
进一步,所述Agent程序用于获取在所述目标注册中心注册的服务列表信息时,具体用于:
向所述目标注册中心发送服务列表信息获取请求,并接收所述目标注册中心返回的服务列表信息。
所述Agent容器与微服务容器部署在同一个Pod中,进而两个容器能够进行本地通信,以及通过同一IP地址对外通信,保证了微服务的正常通信。在微服务能够正常通信的基础上,所述Agent容器中部署有能够调用目标注册中心的服务注册接口的Agent程序,进而微服务能够通过Agent程序进行微服务的注册,即本发明通过Agent容器中的Agent程序间接实现微服务的注册,使得使用非Java语言开发的微服务也能够在Eureka中进行注册,保证使用非Java语言开发的微服务的正常使用。进一步的,本发明中,通过设置Agent程序间接实现微服务的注册,不需要对微服务进行调整,相比于对微服务添加注册程序的方式来说,简化了对微服务的操作。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。