dubbo的demo中,网上很多事把生产者与消费者建立在同一个项目,不同模块中的。而我是把它们分别建成不同的项目,其中生产者我采用springboot + dubbo 编写,而消费者采用spring +dubbo编写。
通常,我们会把服务的接口单独拿出来作为api服务,我这里的做法是单独建立一个工程,然后打成jar包,生产者以及消费者去引入这个jar包即可。
这是api的项目结构,里面定义了一个接口,以及一个bean类
这是接口,它的主要功能是通过计算因子去计算,并且返回计算结果。
package com.dubbo.api.bean.service;
import com.dubbo.api.bean.bean.Factor;
public interface CaculateService {
int add(Factor factor);
}
这是计算因子的java bean
package com.dubbo.api.bean.bean;
import java.io.Serializable;
public class Factor implements Serializable {
private static final long serialVersionUID = 3386485586764910030L;
public Factor(int a,int b){
this.a=a;
this.b=b;
}
private int a;
private int b;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
}
写完之后就可以打成jar包了。
idea 打成jar包的方法是:
首先pom.xml引入
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<useUniqueVersions>false</useUniqueVersions>
<classpathPrefix>lib/</classpathPrefix>
<!--mainclass指的是运行类的全类名-->
<mainClass>cn.happy.MyMapReduce</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
然后
即可。最后要把jar包放到本地的maven仓库,方便其他项目引用。
命令如下:
mvn install:install-file -Dfile=jar包路径 -DgroupId=自定义groupId -DartifactId=自定义artifactId -Dversion=版本号 -Dpackaging=jar
修改上面的 jar包路径,自定义groupId,自定义artifactId,版本号即可。
下面编写生产者代码,采用spring boot+ dubbo
结构如下:
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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.cache.service</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.5</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>com.dubbo.api</groupId>
<artifactId>com.dubbo.api</artifactId>
<version>0.0.5</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
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:application name="provider"/>
<!-- 使用zookeeper做为注册中心 -->
<dubbo:registry protocol="zookeeper" address="zookeeper://localhost:2181"/>
<dubbo:protocol name="dubbo" port="20880" />
<!-- ref中的值要跟服务实现类中的@Server的值一致 -->
<dubbo:service interface="com.dubbo.api.bean.service.CaculateService" ref="demoService"/>
</beans>
接着要具体实现接口,
package com.cache.service.demo.service.impl;
import com.dubbo.api.bean.bean.Factor;
import com.dubbo.api.bean.service.CaculateService;
import org.springframework.stereotype.Service;
@Service("demoService")
public class CaculateServiceImpl implements CaculateService {
@Override
public int add(Factor factor) {
return factor.getA()+factor.getB();
}
}
这便是具体实现接口,最后记得在启动时引入provider.xml文件
package com.cache.service.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;
@SpringBootApplication
@ImportResource("classpath:provider.xml")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
这样消费者即可调用这个生产者提供的服务了。
消费者的配置文件 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="demotest-consumer" owner="programmer" organization="dubbox"/>
<!--向 zookeeper 订阅 provider 的地址,由 zookeeper 定时推送-->
<dubbo:registry address="zookeeper://localhost:2181"/>
<!--使用 dubbo 协议调用定义好的 api.PermissionService 接口-->
<dubbo:reference id="permissionService" interface="com.dubbo.api.bean.service.CaculateService"/>
</beans>
消费者调用服务
package com.cache.service.demo;
import com.dubbo.api.bean.bean.Factor;
import com.dubbo.api.bean.service.CaculateService;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Consumer {
public static void main(String[] args) {
//测试常规服务
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("consumer.xml");
context.start();
System.out.println("consumer start");
CaculateService caculateService =(CaculateService) context.getBean("permissionService");
Factor factor=new Factor(3,5);
int result=caculateService.add(factor);
System.out.print(result);
}
}
看看结果:
正确。