环境筹备
- Centos8.0
- Zookeeper
- IDEA
当然也能够装置到win10上,不过本文是装置在linux上的。
参考文档:centos8装置zookeeper(单机形式)注:zookeeper-3.5.6版本全副替换zookeeper-3.6.2即可
我依照上述文章装置部署没遇到坑,就不再赘述。
Zookeeper客户端插件
咱们间接在 IDEA
上点击 File>Settings>Plugins
而后搜寻zookeeper
,install后重启即可。
如果查找不到点击我帮你解决
装置好插件后点击 File>Settings>Other Settings
顺次点击:
即可看到左侧呈现zookeeper侧边栏
构建模块
顺次创立:
member模块(只有api,并不提供实现):springboot_duboo_member_api
member Service(依赖member模块,api的实现):
springboot_dubbo_member_service_api
order模块(依赖member模块):
spring_dubbo_order_service
member模块
member接口:MemberService.java
package com.baba.wlb.member.service;/** * @Author wulongbo * @Date 2020/12/31 11:48 * @Version 1.0 */public interface MemberService { public String getUser(Long userId);}
子模块中没有启动类,须要在pom中排除一下依赖:pom.xml
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>springboot_emqx</artifactId> <groupId>com.baba.wlb</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>springboot_duboo_member_api</artifactId> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <skip>true</skip> </configuration> </plugin> </plugins> </build></project>
member实现类模块
member实现类接口:MemberServiceImpl.java
package com.baba.wlb.member.service.impl;import com.baba.wlb.member.service.MemberService;/** * @Author wulongbo * @Date 2020/12/31 11:52 * @Version 1.0 */public class MemberServiceImpl implements MemberService { public String getUser(Long userId) { System.out.println("order服务调用member服务 userId:" + userId); return "order服务调用member服务"; }}
spring-provider.xml
配置类:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 提供方利用信息,用于计算依赖关系 在dubbo-admin或dubbo-monitor 会显示这个名字,不便辨识 --> <dubbo:application name="hello-world-app"/> <!-- 应用zookeeper/multicast播送注册核心裸露服务地址 --> <dubbo:registry address="zookeeper://39.102.56.91:2181"/> <!-- 用dubbo协定在20880端口裸露服务 --> <dubbo:protocol name="dubbo" port="20880"/> <!-- 申明须要裸露的服务接口 --> <dubbo:service interface="com.baba.wlb.member.service.MemberService" ref="memberService" protocol="dubbo"/> <!-- 具体实现该接口的bean --> <bean id="memberService" class="com.baba.wlb.member.service.impl.MemberServiceImpl"/></beans>
application启动类:AppMemberApplication.java
package com.baba.wlb.member.service.impl;import org.springframework.context.support.ClassPathXmlApplicationContext;import java.io.IOException;/** * @Author wulongbo * @Date 2020/12/31 14:44 * @Version 1.0 */public class AppMemberApplication { public static void main(String[] args) throws IOException { ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-provider.xml"); applicationContext.start(); System.out.println("member服务启动胜利..."); System.in.read();// 放弃服务始终在运行 }}
外围Maven依赖:
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>springboot_emqx</artifactId> <groupId>com.baba.wlb</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>springboot_dubbo_member_service_api</artifactId> <dependencies> <dependency> <groupId>com.baba.wlb</groupId> <artifactId>springboot_duboo_member_api</artifactId> <version>1.0-SNAPSHOT</version> <scope>compile</scope> </dependency> <!--ZK客户端工具--> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId><!-- <exclusions>--><!-- <exclusion>--><!-- <groupId>org.slf4j</groupId>--><!-- <artifactId>slf4j-log4j12</artifactId>--><!-- </exclusion>--><!-- </exclusions>--> <version>0.10</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <!--dubbo底层框架基于netty实现--> <dependency> <groupId>org.jboss.netty</groupId> <artifactId>netty</artifactId> <version>3.2.5.Final</version> </dependency> <!--spring框架组件--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.9.RELEASE</version> </dependency> <!--dubbo框架--> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> <exclusion> <groupId>org.jboss.netty</groupId> <artifactId>netty</artifactId> </exclusion> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency> </dependencies></project>
注:这里须要排除slf4j依赖,如果启动报错能够手动删除抵触jar
因为删除了相干jar后,后盾启动会报错:
log4j:WARN No appenders could be found for logger (com.alibaba.dubbo.common.logger.LoggerFactory).log4j:WARN Please initialize the log4j system properly.log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
咱们只需在 resource
目录下手动增加 log4j.properties
即可:
log4j.rootLogger=DEBUG, Console#Consolelog4j.appender.Console=org.apache.log4j.ConsoleAppenderlog4j.appender.Console.layout=org.apache.log4j.PatternLayoutlog4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%nlog4j.logger.java.sql.ResultSet=INFOlog4j.logger.org.apache=INFOlog4j.logger.java.sql.Connection=DEBUGlog4j.logger.java.sql.Statement=DEBUGlog4j.logger.java.sql.PreparedStatement=DEBUG
子模块截图:
order服务模块
application启动类:OrderToMember.java
package com.baba.wlb.order;import com.baba.wlb.member.service.MemberService;import org.springframework.context.support.ClassPathXmlApplicationContext;/** * @Author wulongbo * @Date 2020/12/31 15:56 * @Version 1.0 */public class OrderToMember { public static void main(String[] args) { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("consumer.xml"); MemberService memberService = applicationContext.getBean(MemberService.class); String resultUser = memberService.getUser(1l); applicationContext.start(); System.out.println("order服务调用member服务返回后果:" + resultUser); }}
consumer.xml
配置类:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 生产方利用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --> <dubbo:application name="order-consumer"/> <!-- 应用multicast播送注册核心裸露发现服务地址 --> <!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> --> <!-- 应用zk播送注册核心裸露服务地址 --> <dubbo:registry id="zk1" address="zookeeper://39.102.56.91:2181" protocol="zookeeper"/> <!-- 指定是用zk--> <dubbo:consumer registry="zk1"/> <!-- 生成近程服务代理,能够和本地bean一样应用demoService --> <dubbo:reference id="memberService" interface="com.baba.wlb.member.service.MemberService"/></beans>
pom文件
依赖于member模块,copy member服务的就OK
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>springboot_emqx</artifactId> <groupId>com.baba.wlb</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>spring_dubbo_order_service</artifactId> <dependencies> <dependency> <groupId>com.baba.wlb</groupId> <artifactId>springboot_duboo_member_api</artifactId> <version>1.0-SNAPSHOT</version> <scope>compile</scope> </dependency> <!--ZK客户端工具--> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <!-- <exclusions>--> <!-- <exclusion>--> <!-- <groupId>org.slf4j</groupId>--> <!-- <artifactId>slf4j-log4j12</artifactId>--> <!-- </exclusion>--> <!-- </exclusions>--> <version>0.10</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <!--dubbo底层框架基于netty实现--> <dependency> <groupId>org.jboss.netty</groupId> <artifactId>netty</artifactId> <version>3.2.5.Final</version> </dependency> <!--spring框架组件--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.9.RELEASE</version> </dependency> <!--dubbo框架--> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> <exclusion> <groupId>org.jboss.netty</groupId> <artifactId>netty</artifactId> </exclusion> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency> </dependencies></project>
启动服务
duboo流程剖析:1.Provider注册到注册核心Registry(zookeeper)中>2.当节点发生变化的时候,注册核心通过事件告诉的形式告诉给Consumer(tcp长链接的形式),比照Eureka则是每隔一段时间定时去查,http协定做心跳的形式>3.Consumer获取到value实在地址后采纳本地RPC近程调用技术进行拜访接口>4.每一次Consumer调用Provider,监控核心Monitor都会做一次记录
启动member服务:AppMemberApplication.java
察看咱们的zookeeper:
在启动order服务:OrderToMember.java
发现咱们调用胜利!注:这里不再是jar包调用jar包的形式,因为这里咱们只是援用了接口,并没有援用实现,实现都是通过底层转换成netty,dubbo调用的过程
dubbo-admin平台
底层实现连贯zookeeper信息,进行解析并转换成页面进行展现。
公共的资源dubbo-admin下载地址
咱们应用老版本,所以切换分支至master
,点击下载,将zip包解压之后,应用IDEA关上我的项目。
或者间接在此地址关上并下载dubbo-admin
关上我的项目后:
首先执行clean操作,其次执行install操作
老版本:因为我 zookeeper
是装置在linux上的,所以须要批改application.properties
、dubbo.properties
两个文件,如果是本地装置的能够跳过上面步骤。
能够依据本身状况批改一些参数
application.properties
# 设置端口server.port=7001spring.velocity.cache=falsespring.velocity.charset=UTF-8spring.velocity.layout-url=/templates/default.vmspring.messages.fallback-to-system-locale=falsespring.messages.basename=i18n/messagespring.root.password=rootspring.guest.password=guestdubbo.registry.address=zookeeper://39.102.56.91:2181
dubbo.properties
dubbo.container=log4j,spring,registry,jetty-monitordubbo.application.name=simple-monitordubbo.application.owner=dubbo#dubbo.registry.address=multicast://224.5.6.7:1234dubbo.registry.address=zookeeper://39.102.56.91:2181#dubbo.registry.address=redis://127.0.0.1:6379#dubbo.registry.address=dubbo://127.0.0.1:9090dubbo.protocol.port=7070dubbo.jetty.port=8080dubbo.jetty.directory=${user.home}/monitordubbo.charts.directory=${user.home}/monitor/chartsdubbo.statistics.directory=${user.home}/monitor/statisticsdubbo.log4j.file=logs/dubbo-monitor-simple.logdubbo.log4j.level=WARN
启动DubboAdminApplication.java
拜访http://localhost:7001/
并输出账号:root,明码:root
点击 服务治理>服务
能够看到咱们已注册的服务
点击服务:
此外咱们还能够看到日志,版本等信息!
至此,spring就实现了简略的dubbo集成,咱们也能够用springboot来集成更简便!