ÖØµãÀ´ÁË£¬±¾ÎÄÈ«Ãæ²ûÊöÒ»ÏÂÎÒÃǵÄRPCÊÇÔõôʵÏÖ²¢ÈçºÎʹÓõ쬏úKubernetesºÍOpenstackÔõô½áºÏ¡£
ÔÚÑ¡ÐÍÒ»ÎÄÖÐ˵µ½ÎÒÃÇÑ¡¶¨µÄRPC¿ò¼ÜÊÇApache Thrift£¬ËüµÄÓ÷¨ÊÇÔÚMain·½·¨ÖÐÖØÆô·þÎñ£¬ÔÚClient¶ËÁ¬½Ó·þÎñÈ¥µ÷Óã¬
¶øÎÒµÄÏë·¨ÊÇÒª¸úDubblo¡¢HSFµÄÓ÷¨Ò»Ñù£¬ÒòΪºÜ¶àÈ˶¼ÊìϰÕâÁ½¸ö¿ò¼ÜµÄÓ÷¨£¬ÌرðÊÇÎÒÃǺü¸¸öÏîÄ¿¶¼ÊÇ»ùÓÚEDAS¿ª·¢µÄ£¬¶øÇÒÊÀÃæÉÏÓÃDubboµÄ¹«Ë¾Ò²ºÜ¶à¡£
˳±ãÔÙ˵һÏÂÎÒÃǶÔÓÚRPCµÄ¼¸µãÒªÇó£º
1£¬¼æÈÝDubboºÍHSFµÄʹÓ÷½·¨£¬Ö§³Ö°æ±¾ºÍ·þÎñ·Ö×飬֧³ÖÏîÄ¿¸ôÀë
2£¬¿Í»§¶ËÖØÊÔ»úÖÆ£¬¿ÉÒÔÅäÖôÎÊýºÍ¼ä¸ôʱ¼ä
3£¬¿Í»§¶ËÏß³Ì
4£¬·þÎñ¶Ë¿ÉÒÔÆ½»¬ÎÞ·ìÉý¼¶¶ø²»Ó°Ïì¿Í»§¶ËµÄʹÓÃ
¼æÈÝDubbo¾Í±ØÈ»ÒªÊ¹ÓÃSpring¿ò¼Ü£¬ÄÇÎÒÃǾÍÖ±½ÓÉÏSpring
BootºÃÁË£¬ºÅ³ÆSpring BootΪ΢·þÎñ¿ª·¢¶øÉú£¬Ò»²½µ½Î»£¬½«Thrift¸úSpring BootÕûºÏ¡£
°æ±¾ºÍ·þÎñ·Ö×é¿ÉÒÔͨ¹ýKubernetesµÄServiceµÄLabelÀ´ÊµÏÖ£¬ÎÒÃǿͻ§¶ËÔÚ²éÕÒ·þÎñµÄʱºòͨ¹ýÕâÁ½¸ö±êÇ©ÔÙ¼ÓÉϽӿÚÀàµÄLabelÀ´¶¨Î»ServiceµÄCluster
IP£¬ÕâÀï²»Ö±½ÓʹÓÃServiceÃû³ÆÀ´µ÷Ó÷þÎñµÄÔÒòÊÇͨ¹ýLabel²éѯServcie¸ü¼ÓÁé»îһЩ£¬ServiceµÄÃû³Æ²»ÊÜÏÞÖÆ£¬ËæÊ±¿ÉÒÔÆô¶¯Ò»¸ö´øÓÐÏàͬLabelµÄÐÂServiceÀ´Ìæ»»¾ÉµÄService.
ÏîÄ¿¸ôÀë¿ÉÒÔÓÃKubernetesµÄnamespaceÀ´ÊµÏÖ£¬Ò»¸önamespaceÊÇÒ»¸öÏîÄ¿£¬µ±È»ÏîĿ֮¼äÒ²¿ÉÒÔ»¥Ïàµ÷Óã¬Ä¬ÈÏÇé¿öÏÂÊÇÕû¸öKubernetes¼¯ÈºµÄ·þÎñ¶¼ÊÇ¿ÉÒÔ±»µ÷Óõ½µÄÈç¹ûÔÚûÓÐÖ¸¶¨namespaceµÄÇé¿öÏ¡£
¿Í»§¶ËÖØÊÔ»úÖÆÓôúÀíThriftÁ¬½ÓµÄ·½Ê½À´ÊµÏÖ£¬ÔÚÁ¬½Ó»ò½Ó¿Ú·½·¨µ÷ÓÃÒ쳣ʱ·¢ÆðÖØÐÂÁ¬½Ó£¬²Î¿¼£ºhttps://liveramp.com/engineering/reconnecting-thrift-client/
¿Í»§¶ËÁ¬½Ó³ØÊÇÓÉÓÚÔÚWEBÏîÄ¿ÖÐÿ´ÎÓû§·¢ÆðÇëÇóÊÇÔÚÒ»¸ö¶ÀÁ¢µÄÏß³ÌÖУ¬¶øThriftµÄClient
SocketÁ¬½Ó²»ÊÇḬ̈߳²È«µÄ£¬Òò´ËҪΪÿ¸öÓû§×¼±¸Ò»¸öSocketÁ¬½Ó£¬ÓеãÏñÊý¾Ý¿âµÄÁ¬½Ó³Ø£¬Õâ¸ö¿ÉÒÔÓÃapacheµÄcommons
pool2À´ÊµÏÖ£¬Õâ¸öÓкܶàÍøÓѵÄÎÄÕ¿ÉÒԲο¼£¬±¾ÎľͲ»ÔÚ׸ÊöÁË¡£
·þÎñ¶Ëƽ»¬Éý¼¶¿ÉÒÔʹÓÃKubernetesµÄKubectl rolling-updateÀ´ÊµÏÖ£¬ËüµÄ»úÖÆÊÇÏÈ´´½¨Ò»¸öRC£¬È»ºóн¨Ò»¸öа汾Pod£¬Í£µôÒ»¸ö¾É°æ±¾Pod£¬Öð²½À´Íê³ÉÕû¸öRCµÄ¸üУ¬×îºóɾ³ý¾ÉµÄRC£¬°ÑеÄRCÃû³Æ¸ÄΪ¾ÉµÄRCÃû³Æ£¬Éý¼¶¹ý³ÌÈçÏÂͼ£º

ÕâÀï»áÓÐÒ»¸öÎÊÌ⣬ÒòΪÓÐÒ»¸öʱ¼ä¶Î»áоÉRC¹²´æ£¬ÓÉÓÚServiceÊÇ»ùÓÚRCµÄLabel½¨Á¢µÄ£¬ÄǹýÀ´µÄÇëÇóÊDz»ÊÇ»áµÃµ½Á½ÖÖ½á¹û£¿

Èç¹ûÊǵĻ°Òª·ÀÖ¹ÕâÑùµÄÇé¿ö·¢Éú¾ÍÒªÏñÉÏÃæËµµÄ£¬½«Õû¸öServiceÌæ»»£¬ÏÈÆô¶¯Ò»¸öеÄService¸ú¾ÉµÄServiceÓÐÏàͬLabel£¬È»ºóɾ³ý¾ÉµÄServiceÒÔ¼°RC£¬ÔÚ·¢Éú·þÎñÇëÇóµÄʱºòThrift
ClientÔÚÕÒ²»µ½¾ÉµÄ·þÎñµÄʱºò¸ù¾ÝLabelÖØÐ²éÕÒService¾Í»áÇл»µ½ÐµÄServiceÉÏ¡£
ÏÂÃæÕ¹Ê¾Ò»Ï´ó¸ÅµÄʵÏÖ¼°Ê¹Ó÷½·¨£¬¼ÙÉèÄãÊìϰKubernetes»òÕß¼òµ¥Á˽⣬ÊìϰDocker¡£
·þÎñ¶Ë
ÅäÖÃ
<bean class="io.masir.testcloud.thrift.HelloImpl" id="helloImpl"/> <bean class="io.masir.testcloud.thrift.ThriftSpringProviderBean" init-method="init" id="providerBean"> <property name="serviceInterface" value="io.masir.testcloud.thrift.HelloService"/> <property name="serviceVersion" value="1.0.0"/> <property name="serviceGroup" value="testServiceGroup"/> <property name="target" ref="helloImpl"/> </bean> |
ThriftSpringProviderBeanºËÐÄ´úÂë ÕâÊÇThriftºÍSpringÕûºÏµÄºËÐÄ´úÂ룬¿ÉÒÔ½è¼øÆäËüÍøÓѵÄThrift
SpringʵÀý¡£
public
class ThriftSpringProviderBean extends Thread {
private int port = 10809;
private String serviceInterface;
private String serviceVersion;
private String serviceGroup;
private Object target;
public void run() {
try {
TServerSocket serverTransport = new TServerSocket(getPort());
Class Processor = Class.forName(getServiceInterface()
+ "$Processor");
Class Iface = Class.forName(getServiceInterface()
+ "$Iface");
Constructor con = Processor.getConstructor(Iface);
TProcessor processor = (TProcessor) con.newInstance(getTarget());
TBinaryProtocol.Factory protFactory = new TBinaryProtocol.Factory(true,
true);
TThreadPoolServer.Args args = new TThreadPoolServer.Args(serverTransport);
args.protocolFactory(protFactory);
args.processor(processor);
TServer server = new TThreadPoolServer(args);
logger.info("Starting server on port "
+ getPort() + " ...");
server.serve();
} catch (TTransportException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public void init() {
start();
}
public String getServiceInterface() {
if(serviceInterface.endsWith(".Iface")){
serviceInterface = serviceInterface.replace(".Iface","");
}
return serviceInterface;
}
}
|
¿Í»§¶Ë
¿¼Âǵ½KubernetesÊÇÓиºÔغͷþÎñ·¢ÏֵŦÄÜ£¬ÄÇÎÒÃÇÈçºÎ¸úThriftÕûºÏÔÚÒ»ÆðʹÓÃÊÇÎÒÃÇÒª½â¾öµÄÎÊÌâ
ÅäÖÃ
<bean class="io.masir.testcloud.thrift.ThriftClientBeanProxyFactory"> <property name="k8sAPIServer" value="http://100.0.1.5:8080/"/> <property name="interfaceName" value="io.masir.testcloud.thrift.HelloService"/> <property name="version" value="0.0.1"/> <property name="group" value="thrifttest"/> </bean> |
k8sAPIServer ÊÇKubernetesµÄAPIµØÖ·£¬ÓÃÀ´¸ù¾Ý group¡¢version¡¢interfaceName
Èý¸ö²ÎÊý²éÕÒ·þÎñµÄ¼¯ÈºµØÖ·
ThriftClientBeanProxyFactory µÄʵÏÖÇë²Î¿¼
http://blog.csdn.net/muyuxuebao/article/details/51556066
£¬°üÀ¨ÖØÐ»úÖÆÒ²ÓÐÁË¡£
ÁíÍâÍÆ¼öÒ»¸öKubernetes Api·ÃÎʵÄJava×é¼þ£¬·Ç³£ºÃÓúÍÁé»î
<dependency> <groupId>io.fabric8</groupId> <artifactId>kubernetes-client</artifactId> <version>1.4.14</version> </dependency>
|
Éú³ÉImage
·þÎñµÄDockerfile
FROM registry2.io/public/java:7 Copy jn-boot-0.0.1.jar /jn-boot.jar EXPOSE 10809 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime RUN echo Asia/Shanghai > /etc/timezone ENV TZ Asia/Shanghai ENTRYPOINT java -jar /jn-boot.jar |
Ïû·ÑÕßDockerfile
FROM registry2.io/public/java:7 COPY jn-boot-client-0.0.2.jar /jn-boot-client.jar EXPOSE 10809 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime RUN echo Asia/Shanghai > /etc/timezone ENV TZ Asia/Shanghai ENTRYPOINT java -jar /jn-boot-client.jar |
ÐèÒªÓÐÁ½¸öµØ·½×¢Òâһϣ¬Ê¹ÓÃCopy£¬Ã¿´Î¶¼Òª¸²¸Ç¿½±´µ½ImageÖУ¬ÁíÒ»¸öÊÇÈÕÆÚÓ¦¸Ã·ÅÔÚ»ù´¡ImageÖУ¬BuildÉú³ÉImageºóPushµ½ÎÒÃÇRegistryÖС£

²¿Êðµ½Kubernetes
³ÌÐò¿ª·¢»òÕß˵¿ª·¢Ë¼Â·»ù±¾ÊµÏÖÁË£¬ÏÂÃæ¾ÍÊDz¿ÊðÉÏÏß²âÊÔ£¬KubernetesµÄPods»ùÓÚDockerÔËÐУ¬ÄǾͻáÓõ½Registry£¬Ò»¸öPod»áÊÇÒ»¸öDockerÈÝÆ÷£¬ËùÒÔKubernetesµÄÁ÷³ÌÊÇ´ÓRegistryÖÐÄõ½ImageÈ»ºóÆô¶¯Ò»¸öDokcerÈÝÆ÷£¬ÓÉÓÚÎÒÃÇÅäÖõÄRegistryÊÇÓÐȨÏ޵ģ¬ËùÒÔÒªÏÈÉú³ÉKubernetesµÄSecrets£¬
kubectl create secret docker-registry registry2key --docker-server=registry2.io
--docker-username=admin --docker-password=1 --docker-email=xxxx@163.com --namespace=thrift-demo |
È»ºóÔÚyamlÖÐÅäÖãº
apiVersion: v1 kind: ReplicationController metadata: name: thrift-c namespace: thrift-demo spec: replicas:1 selector: app: thrift-c template: metadata: name: thrift-c labels: app: thrift-c spec: containers: - name: thrift-c image: registry2.io/thrift/thrift-c:0.0.2 imagePullPolicy: Always ports: - containerPort: 9091 imagePullSecrets: - name: registry2key |
×¢ÒâÀïÃæµÄ imagePullSecrets registry2key
{ "kind": "Service", "apiVersion": "v1", "metadata": { "name": "thrift-c-app", "namespace": "thrift-demo" }, "spec": { "selector": { "app": "thrift-c" }, "ports": [ { "protocol": "TCP", "port": 9091, "targetPort": 9091 } ] } } |
KubernetesµÄÅäÖÃÍøÉÏÓкܶ࣬´ó¼Ò·ÖÍ·È¥²Î¿¼£¬ÕâÀï²»¹ý¶à˵Ã÷£¬ÕâÊÇÒ»¸öThrift¿Í»§¶ËµÄKubenetes
RCºÍServiceÅäÖã¬ÔÚKubernetes MasterÔÆÖ÷»úÉÏͨ¹ýKubectlÔËÐв¢Æô¶¯Õâ¸öRC

ÁíÍ⻹ÐèÒª²¿ÊðThrift·þÎñ¶ËµÄRC¡¢Service£¬Èçͼ£º
£¨Çë×¢Òâ·þÎñ¶ËµÄServiceµÄLabel£©
ÏÂÃæÊÇReplication Controllers

µ÷ÓòâÊÔ£¬²é¿´·þÎñµÄ·ÃÎʵØÖ·£¬ÎÒÃǵĿͻ§¶Ë·þÎñʹÓõÄÊÇNodeport£¬²é¿´NodeportµÄ·½Ê½£¬»òÕßÔÚDashboardÉϲ鿴

È»ºóͨ¹ýKubernetes¼¯ÈºÖеÄÈÎÒâһ̨»úÆ÷¼ÓÉÏNodePort¶Ë¿Ú¾Í¿ÉÒÔ·ÃÎÊÎÒÃǵÄThrift¿Í»§¶Ë·þÎñÁË¡£
ÔÚ±¾ÎÄÖÐÎÒÃÇ¿ÉÒÔ¿´µ½Ê¹ÓÃÁË´óÁ¿µÄKubernetesÌØÐÔ£¬·þÎñ·¢ÏÖ¡¢·þÎñ¸ºÔØ£¨»ùÓÚService£©¡¢¹ö¶¯Éý¼¶µÈµÈ£¬ÆäÖзþÎñ·¢ÏÖÊÇÔÚÎÒÃÇÌí¼ÓÁËPodsÊýÁ¿ºó»á±»Service×Ô¶¯·¢ÏÖ£¬°üÀ¨ºóÃæÒªËµµÄ×Ô¶¯À©ÈÝ£¬¶ø¸ºÔؾÍÊÇService»áÔÚËùÓÐPodsÖÐͨ¹ýijÖÖ»úÖÆÑ¡Ôñij¸öPodÀ´µ÷Óã¬ÊÂʵÉÏ»¹ÓкܶàKubernetesµÄÌØÐԵȴýÎÒÃÇȥʹÓúͷ¢¾ò£¬KubernetesÕæÊÇÒ»¸öµÃÁ¦µÄÈÝÆ÷ÖúÊÖ£¬Ï£ÍûÎÒÃÇÄܰÑËüÓúã¬Ò²Ï£ÍûKubernetesÔ½À´Ô½ÍêÉÆ¡£
ÔÚÏÂÎÄÖÐÎÒÃǽ«ËµÒ»Ëµ·þÎñµÄ·¢²¼£¬×ܲ»Äܶ¼Í¨¹ýIP+NodePortµÄ·½Ê½À´·ÃÎÊËùÓÐWEB·þÎñ°É£¬Ò»¶¨ÒªÓÐÒ»¸öÍêÃÀµÄºÏÊʵĽâ¾ö°ì·¨£¬ÄÇ»áÊÇÊ²Ã´ÄØ¡£¡£¡£ |