一、注册中心-zookeeper
1.zookeeper
zookeeper可以在分布式项目中承担以下几个功能:
1)注册中心
2)存储数据: 分布式锁
3)观察者模式:做到多个分布式服务器之间的数据同步
2.如何搭建zookeeper
要么使用docker搭建,要么使用原生的方式搭建。
1)在虚拟机上安装jdk
- 上传jdk的压缩包到虚拟机的 /usr/local/java文件夹内
- 解压缩
tar -zxvf jdk.....tar.gz
- 配置环境变量
vim /etc/profile
复制以下内容到该文件的末尾
export JAVA_HOME=/usr/local/java/jdk1.8.0_191
export JRE_HOME=/usr/local/java/jdk1.8.0_191/jre
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin
- 保存并退出
:wq
- 让配置生效
source /etc/profile
2)安装Zookeeper
- 上传压缩包到linux
- 解压缩
3)获得zoo.cfg配置文件
在zookeeper/conf文件夹内,修改zoo_sample.cfg中的内容后并重命名成zoo.cfg
4)如何使用zookeeper(做注册中心)
注意: 要使用linux中的命令,必须两种方式: 要么./zkServer.sh 要么是完整路径:
/usr/local/zookeeper/zookeeper-3.4.14/bin/zkServer.sh
- 如何启动zk
./zkServer.sh start
- 如何查看zk状态
./zkServer.sh status
- 如何关闭zk
./zkServer.sh stop
二、使用Dubbo来实现服务间的调用
相关概念:
1) 工程: 包含多个项目的一个统称
1.创建父工程
2.在父工程中创建一个接口项目
接口项目取消父依赖
在项目中创建具体的接口
3.在父工程中创建服务的提供者
编写实现类,实现接口,并重写方法,注意要把api的项目依赖进来。
4.在服务提供者项目中使用dubbo
1)创建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="product-service-provider"/><!--配置注册中心的地址-->
<
dubbo:registry address="zookeeper://10.31.163.100:2181"/><!--配置当前服务在dubbo中的协议端口-->
<
dubbo:protocol port="20880"/><!--配置接口-->
<
dubbo:service inter ref="productService"/><!--配置接口的实现类-->
<
bean id="productService" class="com.qf.product.service.impl.ProductServiceImpl"/>
</
beans>
2)编写单元测试,引入配置文件,并启动dubbo
注意:前提是要启动zk注册中心
public class TestServiceProvider {
@Test
public void testService() throws IOException {
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext(new String[]{"classpath:provider.xml"});
//将服务提交给dubbo的container,然后注册到注册中心上
context.start();
System.out.println("商品服务开始提供服务");
System.out.println("按任意键停止");
//让服务在收到任意输入内容之前不会结束
System.in.read();
}
}
当看到这个结果,就表示服务发布成功
5.创建服务消费者项目
1)引入依赖
<!--引入dubbo的依赖-->
<
dependency>
<
groupId>com.alibaba</
groupId>
<
artifactId>dubbo</
artifactId>
<
version>2.5.8</
version>
</
dependency><!-- zookeeper客户端依赖 -->
<
dependency>
<
groupId>com.github.sgroschupf</
groupId>
<
artifactId>zkclient</
artifactId>
<
version>0.1</
version>
</
dependency>
<
dependency>
<
groupId>com.qf</
groupId>
<
artifactId>my-dubbo-product-api</
artifactId>
<
version>1.0.0-SNAPSHOT</
version>
</
dependency>
2)编写配置文件
<?
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="product-consumer"/><!--配置注册中心的地址-->
<
dubbo:registry address="zookeeper://10.31.163.100:2181"/><!--配置要使用的接口所在的路径-->
<
dubbo:reference inter id="productService"/>
</
beans>
3)在单元测试中去调用service
@Test
public voidtestInvoke(){
ClassPathXmlApplicationContext context =
newClassPathXmlApplicationContext(
newString[]{
"classpath:consumer.xml"});
IProductService productService = (IProductService) context.getBean(
"productService");
String s = productService.showProd();
System.
out.println(s);
}
小结:
三、在Springboot项目中使用dubbo
1.方式一: 基于XML的整合方式
1)创建springboot的服务提供者项目
(1)引入依赖
<
dependency>
<
groupId>com.alibaba.boot</
groupId>
<
artifactId>dubbo-spring-boot-starter</
artifactId>
<
version>0.2.0</
version>
</
dependency>
(2)将xml配置文件放进resources中
(3)在springboot的入口类上打上注解:@ImportResource("classpath:provider.xml")
2)创建springboot的服务消费者项目
(1)引入依赖
<
dependency>
<
groupId>com.alibaba.boot</
groupId>
<
artifactId>dubbo-spring-boot-starter</
artifactId>
<
version>0.2.0</
version>
</
dependency>
(2)将xml配置文件放进resources中
(3)在springboot的入口类上打上注解:@ImportResource("classpath:consumer.xml")
(4)使用autowired将接口的实现类的对象自动注入进来,相当于是通过dubbo(zk)来提供服务的提供者的类。
@SpringBootTest
classMySpringBootProductConsumerApplicationTests {
@Autowired
privateIProductService
productService;
@Test
voidcontextLoads() {
System.
out.println(
productService.showProduct());
}
}
2.方式二:基于注解的整合方式
1)创建服务提供者项目
(1)引入依赖
(2)编写application.yml文件,加入以下配置(本来在xml中的配置将写在yml中)
server:
port: 8081
dubbo:
application:
name: product-service-provider
registry:
address: zookeeper://10.31.163.100:2181
protocol:
port: 20884
(3)编写服务提供者类并实现接口,并在接口上打上注解:
@Component
@Service <==import com.alibaba.dubbo.config.annotation.Service;
(4)在入口类上打上注解
@EnableDubbo
2)创建服务消费者项目
(1)引入依赖
(2)编写application.yml文件,加入以下配置(本来在xml中的配置将写在yml中)
server:
port: 8082
dubbo:
application:
name: product-consumer
registry:
address: zookeeper://10.31.163.100:2181
(3)在需要用到服务提供者类的时候,使用@Reference注解
来自于com.alibaba.dubbo.config.annotation.Reference;
@SpringBootTest
classMySpringBootAnnotationProductConsumerApplicationTests {
@Reference
privateIProductService
productService;
@Test
voidcontextLoads() {
System.
out.println(
productService.showProduct());
}
}
(4)在入口类上打上注解
@EnableDubbo