±à¼ÍƼö: |
±¾ÎÄͨ¹ýSpring Boot¹¹½¨ÁËÒ»¸ö×îСµÄDubboÓ¦Óã¬ÈÝÆ÷»¯ºó³É¹¦²¿Êðµ½°¢ÀïÔÆÈÝÆ÷·þÎñÉÏ¡£
±¾ÎÄÀ´×ÔÓÚ°¢ÀïÔÆ£¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼¡¢ÍƼö¡£ |
|

Dubbo¸ÅÊö
DubboÊǰ¢À↑ԴµÄÒ»¸ö·Ö²¼Ê½·þÎñ¿ò¼Ü£¬ÔÚ¹úÄÚ·ÛË¿ºÜ¶à¡£¹ÙÍøÉϵĽéÉÜÊÇ£º
DUBBOÊÇÒ»¸ö·Ö²¼Ê½·þÎñ¿ò¼Ü£¬ÖÂÁ¦ÓÚÌṩ¸ßÐÔÄܺÍ͸Ã÷»¯µÄRPCÔ¶³Ì·þÎñµ÷Ó÷½°¸£¬Êǰ¢Àï°Í°ÍSOA·þÎñ»¯ÖÎÀí·½°¸µÄºËÐÄ¿ò¼Ü£¬Ã¿ÌìΪ2,000+¸ö·þÎñÌṩ3,000,000,000+´Î·ÃÎÊÁ¿Ö§³Ö£¬²¢±»¹ã·ºÓ¦ÓÃÓÚ°¢Àï°Í°Í¼¯Íŵĸ÷³ÉÔ±Õ¾µã¡£
DubboµÄÎĵµºÜÍêÕû£¬ÍøÂçÉÏ×ÊÔ´Ò²ºÜ¶à£¬ÕâÀï¾Í²»ÔÙÖØ¸´ÁË¡£±¾ÎÄ×öÕâÑùÒ»¸ö³¢ÊÔ£¬½«Ò»¸öDubboÓ¦ÓÃÈÝÆ÷»¯£¬²¿Êðµ½°¢ÀïÔÆµÄÈÝÆ÷·þÎñÉÏ¡£
¼«¼òDubboÓ¦Óýṹ
ÔÚDubboÊÀ½çÀ·þÎñµ÷Ó÷½ºÍ·þÎñÌṩ·½Í¨¹ýDubboµÄ·¢ÏÖ»úÖÆ»¥Ïà·¢ÏÖ¡£Ò»¸ö×îСµÄDubboÓ¦Óðüº¬ÈçÏÂÈý¸ö·þÎñ£º
·þÎñÌṩÕß
·þÎñµ÷Ó÷½
·¢ÏÖ»úÖÆ£¨ÀýÈçzookeeper£©

zookeeperÒѾÓÐDocker¾µÏñÁË£¬ÏÂÃæÎÒÃǾͻáÓÃSpring Boot¿ª·¢·þÎñÌṩ·½Service
ProducerºÍ·þÎñµ÷Ó÷½Service Consumer¡£
¶¨Òå·þÎñ½Ó¿Ú
´´½¨Ò»¸öMavenÄ£¿éservice-api£¬¶¨Òå·þÎñ½Ó¿Ú¡£
public interface
Greetings {
String say(String name);
} |
Õâ¸ö½Ó¿ÚºÜ¼òµ¥£¬¾ÍÊÇÎʺá£
ÔÚpom.xmlÖÐÒýÈë¶ÔDubboµÄÒÀÀµ£º
<dependencies>
<dependency> <groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version> </dependency>
</dependencies> |
ÎÒÃÇÓõÄÊÇdubbo 2.5.3°æ±¾£¬¶ÁÕßÈç¹ûÔ¸Òâ³¢ÊÔ¸üеİ汾£¬¿ÉÒÔ×ÔÐÐÉý¼¶¡£
·þÎñÌṩ·½ Service Producer
´´½¨Ò»¸öMavenÄ£¿éservice-producer£¬Ìṩ·þÎñ½Ó¿ÚµÄʵÏÖ¡£
public class
GreetingsImpl implements Greetings {
public String say(String name) {
return "Greetings from " + name;
}
} |
ΪÁËÄÜÕÒµ½·þÎñ½Ó¿ÚÄ£¿é£¬ÐèÒªÔÚpom.xmlÖж¨Òå¶Ôservice-apiµÄÒÀÀµ¡£
<dependencies>
... <dependency> <groupId>com.example</groupId>
<artifactId>dubbo-service-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency> |
Dubboͨ¹ýspring xmlÅäÖÃÎļþµÄ·½Ê½ÉùÃ÷¶ÔzookeeperµÄ·ÃÎÊ¡£ÔÚresourcesĿ¼Ï´´½¨services.xml£¬ÆäÖÐ×îÖØÒªµÄÄÚÈÝÊÇÖ¸¶¨zookeeperµÄµØÖ·ºÍ¶Ë¿Ú£¬ÎªÁ˲»°ÑzookeeperµÄµØÖ·Ð´ËÀÔÚÅäÖÃÎļþÖУ¬ÎÒÃDzÉÓû·¾³±äÁ¿À´Ö¸Ã÷·þÎñµØÖ·¡£ÕâÒ²ÊÇ12
factorÓ¦ÓõÄÒ»¸öÍÆ¼öʵ¼ùÖ®Ò»¡£
<dubbo:registry
protocol=" zookeeper" address="${ZOOKEEPER_SERVER}:2181"
/>
<dubbo: protocol name= " dubbo"
port="20880" />
<dubbo:service interface= "com.example.service.Greetings"
ref= "greetingService"/>
<bean id= "greetingService" class=
"com.example.service.producer.GreetingsImpl"
/> |
xmlÎļþÖÐµÄÆäËûÄÚÈݰüÀ¨Ö¸¶¨±¾·þÎñµÄÕìÌý¶Ë¿ÚΪ20880£¬GreetingsImplÀàʵÏֵĽӿÚAPIÀàµÈ¡£
ÏÂÃæÒªÔÚpom.xmlÒýÈëdubboµÄÏîÄ¿ÒÀÀµ¡£
<dependencies>
...
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency> |
ÎÒÃÇ×¼±¸ÓÃspring 4.x£¬ËùÒÔ°ÑdubboÖÐ×Ô´øµÄÀϰ汾springframeworkÌÞ³ý¡£
ÏÖÔÚ·þÎñµÄʵÏÖÀàÓÐÁË£¬ÎÒÃÇÐèÒªÒ»¸öÖ÷º¯Êý°ÑʵÏÖÀàÔËÐÐÆðÀ´¡£SpringbootÓÐÒ»¸öºÜºÃµÄÌØÐÔ£¬¾ÍÊǰÑÒ»¸öJavaÓ¦ÓõÄËùÓÐÏà¹ØÒÀÀµ´ò°ü³ÉΪһ¸ö³¬¼¶JAR°ü£¬¶ÔÓÚÉú³ÉDocker¾µÏñÀ´Ëµ·Ç³£·½±ã¡£
Ê×ÏÈÔÚpom.xmlÖÐÒýÈëspringbootÒÀÀµ¡£
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
... |
´´½¨Ò»¸öSpringÖ÷Ó¦Óá£ÓÉÓÚDubbo²ÉÓÃxmlÅäÖÃÎļþµÄ·½Ê½£¬ÒªÍ¨¹ý@ImportResourceÉùÃ÷¼ÓÔØservices.xmlÅäÖÃÎļþ¡£
@SpringBootApplication
@ImportResource({"classpath:services.xml"})
public class Application {
public static void main(String[] args) throws
Exception{
SpringApplication.run(Application.class, args);
}
} |
Springboot WebÓ¦ÓÃÆô¶¯ºó»á×Ô¶¯ÕìÌý8080¶Ë¿Ú¡£²»¹ýÎÒÃÇÔÚÕâÀïûÓÐÓõ½ÄÚÖõÄtomcatºÍ8080¶Ë¿Ú¡£Èç¹ûÄ㲻ϲ»¶Õâ¸ö¶àÓàµÄtomcat£¬¿ÉÒÔÓÃspring-boot-starterÌæ»»±¾ÎÄÖеÄspring-boot-starter-webÏîÄ¿£¬µ«Òª×¢ÒâµÄÊÇ£¬Ã»ÓÐtomcatµÄ´úÂëÐèÒªÔö¼Ó²»Í˳öÓ¦ÓõÄÂß¼¡£
·þÎñµ÷Ó÷½ Service Consumer
Service ConsumerµÄ½á¹¹ºÍProducerµÄ½á¹¹ÀàËÆ£¬Ò²ÐèÒªÔÚpom.xmlÖÐÒýÈë¶Ôdubbo,
service-apiºÍspringbootµÄÒÀÀµ¡£ÔÚresoucesĿ¼Ï´´½¨services.xml£¬ÉùÃ÷zookeeperµÄµØÖ·ºÍÒª·ÃÎʵķþÎñ½Ó¿Ú£º
<dubbo:registry
protocol="zookeeper" address="${ZOOKEEPER_SERVER}:2181"
/>
<dubbo:reference id="greetingService"
interface= "com.example.service.Greetings"
/> |
Ô¶³Ìµ÷ÓõķþÎñbeanÃû×ÖΪgreetingService£¬ÔÚÏÂÃæµÄ´úÂëÖÐÒªÓõ½¡£
ÔÚApplicationÖ÷Ó¦ÓÃÖе÷ÓÃService Producer¡£
Greetings
greetingService = (Greetings)context.getBean("greetingService");
String result = greetingService.say("Dubbo
Docker"); |
ΪÁËÄܹ»ÓÃHTTP·ÃÎÊConsumerÓ¦Óã¬ÎÒÃÇÓÃ@RequestMapping½«context
root £¯Ó³Éäµ½·½·¨ÉÏ¡£
@RequestMapping("/")
public String greetings(){
... |
ConsumerÆô¶¯ÕìÌýµÄ¶Ë¿ÚÔÚresources/application.propertiesÎļþÖÐÖ¸¶¨£º
server.port=${SERVER_PORT:0} |
±àÒë²¢ÔÚ±¾µØÔËÐÐ
ÔÚÏîÄ¿µÄ¸ùĿ¼ÏÂÔËÐÐMaven±àÒ룺
´ÓDocker¾µÏñÖÐÆô¶¯zookeeper£¬²¢°Ñ2181¶Ë¿ÚÓ³Éäµ½±¾»ú£º
docker run
-d -p 2181:2181 -p 2888:2888 -p 3888:3888 registry.aliyuncs.com/acs
-sample/zookeeper:3.4.8 |
ÔÚ»·¾³±äÁ¿ÖÐÖ¸¶¨zookeeperµØÖ·£¬Æô¶¯Service Producer¡£
export ZOOKEEPER_SERVER=127.0.0.1
java -jar target/dubbo- service-producer-1.0-SNAPSHOT.jar |
Æô¶¯Service Consumerʱ³ýÁËÒªÖ¸¶¨zookeeperµØÖ·Í⣬»¹ÒªÖ¸¶¨consumer×Ô¼ºÕìÌýµÄµØÖ·£¬±¾Ê¾ÀýÖÐʹÓõÄÊÇ8899¡£
export ZOOKEEPER_SERVER=127.0.0.1
export SERVER_PORT=8899
java -jar target/dubbo-service-consumer-1.0-SNAPSHOT.jar |
·ÃÎÊÒ»ÏÂcosumerµÄHTTP 8899¶Ë¿Ú£¬¿ÉÒÔ¿´µ½ÏûÏ¢µÄÊä³ö¡£ËµÃ÷·þÎñµ÷Ó÷½´ÓzookeeperÖлñµÃÁËÕýÈ·µÄproducerµÄµØÖ·£¬²¢ÓÃdubboÔ¶³Ìµ÷ÓÃÐÒé³É¹¦µ÷ÓÃÁËproducerµÄGreetingService¡£
$curl http://localhost:8899/
Greetings from Dubbo Docker |
¹¹½¨Docker¾µÏñ
ΪProducerºÍConsumer¹¹½¨Docker¾µÏñºÍÕý³£µÄSpringBootÓ¦ÓÃÒ»Ñù£¬DockerfileÄÚÈÝÈçÏ£º
FROM openjdk:8-jre
VOLUME /tmp
COPY target/*.jar app.jar
RUN sh -c 'touch /app.jar'
CMD ["java", "-Djava.security.egd
=file:/dev/./urandom", "-jar","/app.jar"] |
°ÑÕâ¸öÎļþ·Ö±ð·ÅÔÚProducerºÍConsumerµÄĿ¼Ï£¬Ö´ÐÐDockerµÄ±àÒëÃüÁî¼´¿É´ò°üÉú³ÉÈÝÆ÷¾µÏñ¡£
ÔÚservice-producerĿ¼ÏÂÔËÐУº
mvn package
docker build -t producer . |
Éú³Éservice-consumer¾µÏñÀàËÆ£¬ÕâÀï¾Í²»Öظ´ÁË¡£
Á½¸ö¾µÏñÉú³Éºó£¬¿ÉÒÔÓÃDocker ComposeÃüÁîÆô¶¯¡£¶ÔÓ¦µÄdocker-compose.ymlÄÚÈÝÈçÏ£º
version:
"2"
services:
zookeeper:
image: 'registry.aliyuncs.com/acs -sample/zookeeper:3.4.8'
hostname: zookeeper
producer:
image: 'producer:latest'
environment:
- ZOOKEEPER_SERVER=zookeeper
consumer:
image: 'consumer:latest'
environment:
- ZOOKEEPER_SERVER=zookeeper
- SERVER_PORT=8899
ports:
- 8899:8899 |
ÔÚÕâÀï°ÑzookeeperÈÝÆ÷µÄÖ÷»úÃûhostnameÉèÖÃΪzookeeper²¢Í¨¹ý»·¾³±äÁ¿´«¸øproducerºÍconsumer¡£ÔËÐÐDocker
ComposeÆô¶¯Èý¸öÈÝÆ÷¡£
$docker-compose
up -d
Creating docker_consumer_1
Creating docker_zookeeper_1
Creating docker_producer_1 |
ÈÝÆ÷Æô¶¯³É¹¦ºóÓÃͬÑù·½Ê½·ÃÎÊ8899¶Ë¿Ú¿ÉÒÔ¿´µ½ÕýÈ·µÄÊä³ö¡£
$curl http://localhost:8899/
Greetings from Dubbo Docker |
²¿Êðµ½°¢ÀïÔÆÈÝÆ÷ÉÏ
ºÃÁË£¬ÖÁ´ËÎÒÃÇÒѾ³É¹¦µØÔÚ±¾µØDocker»·¾³ÖÐÔËÐÐÁËDubboÓ¦Óã¬ÏÂÃæ¾ÍÒª½«Õâ¸öÓ¦Óò¿Êðµ½°¢ÀïÔÆÈÝÆ÷·þÎñÉÏ¡£
Ê×Ïȵǽ°¢ÀïÔÆDocker¾µÏñ²Ö¿â£¬µØÖ·ÔÚ´Ëhttps://cr.console.aliyun.com/£¬´´½¨2¸ö¾µÏñ²Ö¿â¡£ÔÚ±¾Ê¾ÀýÖÐÃüÃûΪdubbo-springboot-producerºÍdubbo-springboot-consumer¡£
´´½¨Ò»¸öΪ°¢ÀïÔÆ²¿ÊðµÄÄ£°æÎļþ£¬docker-compose-acs.yml£¬ÄÚÈݺÍdocker-compose.ymlÀàËÆ¡£
version:
"2"
services:
zookeeper:
image: 'registry.aliyuncs.com/acs -sample/zookeeper:3.4.8'
hostname: zookeeper
producer:
image: 'registry.cn -hangzhou.aliyuncs.com/${rname}/dubbo
-springboot-producer:latest'
environment:
- ZOOKEEPER_SERVER=zookeeper
consumer:
image: 'registry.cn-hangzhou.aliyuncs.com/${
rname }/dubbo -springboot-consumer:latest'
environment:
- ZOOKEEPER_SERVER=zookeeper
- SERVER_PORT=8899
labels:
aliyun.routing.port_8899 : http://ds-consumer |
Õâ¸ö²¿ÊðÎļþºÍdocker-compose.ymlÄÚÈݲ»Í¬Ö®´¦ÔÚÓÚ£¬ËùÓÐÈÝÆ÷µ½Ö÷»ú¶Ë¿ÚÓ³É䶼ȥµôÁË£¬ÎªÁËÄÜ·ÃÎÊconsumer£¬Ê¹ÓÃÁËaliyun.routing.port_8899ΪconsumerÖ¸¶¨Ò»¸ö×ÓÓòÃû¡£¼¯Èº²¿Êðºó¿ÉÓÃÈçÏÂURL·ÃÎÊconsumer·þÎñ¡£
http://ds-consumer.c67***8cd5.cn-shenzhen.alicontainer.com
µÇ½°¢ÀïÔÆÈÝÆ÷·þÎñ¿ØÖÆÌ¨ https://cs.console.aliyun.com£¬ÀûÓò¿ÊðÄ£°æ´´½¨Ò»¸öÐÂÓ¦Ó㬲¿ÊðÄ£°æµÄÄÚÈݾÍÊÇÉÏÃædocker-compose-acs.ymlÄÚÈÝ£¬ÌáʾrnameʱÊäÈëÄãµÄÈÝÆ÷²Ö¿âÓû§Ãû£¬ºÜ¿ìÓ¦Óò¿Êð¾Í»á³É¹¦¡£
ÔÚ¿ØÖÆÌ¨ÖнøÈëconsumer·þÎñÒ³Ãæ£¬ÕÒµ½·ÃÎʶ˵㣺

µã»÷µØÖ·£¬¿ÉÒÔÔÚä¯ÀÀÆ÷Öп´µ½Êä³ö£º

ÖÁ´Ë£¬ÎÒÃdzɹ¦µØÔÚÔÆÉÏÔËÐÐÁËDubboÓ¦Óá£
±¾ÎÄÖеÄcomposeÄ£°æ²¿ÊðΪv2°æ±¾£¬Èç¹û´ó¼ÒÏë³¢ÊÔÀûÓÃv3°æ±¾²¿Ê𣬿ÉÒÔ·ÃÎÊgithub
ÌÖÂÛ
ÔÚÍøÉÏÓÐÌÖÂÛÈÝÆ÷»¯µÄDubboÓ¦Ó÷¢Ë͵ÄIPµØÖ·²»¶Ô£¬¾Êµ²âÔÚDocker 1.12°æ±¾ÏÂûÓÐÕâ¸öÎÊÌ⣬²¿Êðµ½°¢ÀïÔÆÈÝÆ÷·þÎñÉÏÒ²Õý³£¡£±¾ÎĵÄʾÀý´úÂëÔÚgithubÉÏ£¬´ó¼Ò¿ÉÒԲο¼¡£
|