调用中心有了,现在开始搭建项目框架。
一、工程结构
我这里采用gradle,项目分为3块,api,interface,service。
api主要是对外暴露restful接口,并调用provider,引用interface
interface的内容是service的接口和实体,用于RPC调用
service是微服务主体,注册到dubbo供consumer消费,也引用interface
另外,项目用到的一些通用工具和配置,我们提取到common项目,连接数据库的配置,我们提取到jdbc项目
结构如下图
二、依赖
目前先考虑微服务调用相关,我们需要spring-boot-starter-web,dubbo-spring-boot-starter,zkclient,另外还有一些常用的用到再加,我把依赖提取了一个gradle文件,内容如下:
ext {
springboot= "1.5.10.RELEASE"
libs = [
springboot: [
"org.springframework.boot:spring-boot-starter-web:${springboot}",
],
dubbo:[
"com.alibaba.spring.boot:dubbo-spring-boot-starter:2.0.0",
"com.101tec:zkclient:0.9"
],
commons: [
"redis.clients:jedis:3.0.0",
"com.alibaba:fastjson:1.2.4",
"com.alibaba:druid:1.0.30",
"dom4j:dom4j:1.6.1",
"ch.qos.logback:logback-classic:1.2.3",
"ch.qos.logback:logback-core:1.2.3",
"com.sun.mail:mailapi:1.6.0",
"com.sun.mail:smtp:1.6.0",
"mysql:mysql-connector-java:5.1.39",
"cn.easyproject:ojdbc7:12.1.0.2.0",
"org.formcept:sqljdbc42:4.2",
"net.sourceforge.jtds:jtds:1.3.1",
"org.slf4j:slf4j-api:1.7.13",
"cn.afterturn:easypoi-base:3.0.3",
"cn.afterturn:easypoi-web:3.0.3",
"cn.afterturn:easypoi-annotation:3.0.3",
]
]
}
三、编写provider
1.添加application.properties,填入内容
#provider name
dubbo.application.name=ktp-auth-provider
#package to scan dubbo service
dubbo.scan.base-packages=cn.ktp.auth.service
dubbo.protocol.name=dubbo
#use -1 to allow dubbo regeist a random port
dubbo.protocol.port=-1
#Dubbo Registry Address
dubbo.registry.address=zookeeper://10.8.80.232:2181?backup=10.8.80.232:2182,10.8.80.232:2183
(我的eclipse没安装properties插件,写中文会被转码,这些中式英文注释将就看吧……)
2.编写启动类
package cn.ktp.auth;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
@EnableDubbo
@SpringBootApplication
public class KtpAuthProvider {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(KtpAuthProvider.class);
app.setWebEnvironment(false);
// 运行
app.run(args);
com.alibaba.dubbo.container.Main.main(args);
}
}
@EnableDubbo用于自动加载dubbo配置
因为provider并不对外暴露http接口,所以我这里设置不启用web环境,这样就可以不配置端口,但是当dubbo注册完成之后就直接结束进程了,为了解决这个加了一句com.alibaba.dubbo.container.Main.main(args);
3.编写接口
在interface项目中编写一个接口,暴露一个hello方法
package cn.ktp.auth.iservice;
public interface IAuthService {
public String hello();
}
4.编写服务,注意这里的Service注解是dubbo的,后面如果需要使用spring其他特性,还需要加上Spring的Service注解
package cn.ktp.auth.service;
import com.alibaba.dubbo.config.annotation.Service;
import cn.ktp.auth.iservice.IAuthService;
@Service
public class AuthService implements IAuthService{
@Override
public String hello() {
return "hello1";
}
}
至此,provider就已经搞定,运行KtpAuthProvider,登陆dubboAdmin可以看到已经注册成功
四、编写Consumer,即api项目
1.添加application.properties,填入内容
server.port=7002
dubbo.application.name=ktp-auth-consumer
dubbo.scan.base-packages=cn.ktp.auth.api
dubbo.registry.address=zookeeper://10.8.80.232:2181?backup=10.8.80.232:2182,10.8.80.232:2183
这里只需要应用名,扫描包名和注册中心地址
2.编写启动类
package cn.ktp.auth;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
@EnableDubbo
@EnableAutoConfiguration
@SpringBootApplication
public class KtpAuthConsumer {
public static void main(String[] args) {
SpringApplication.run(KtpAuthConsumer.class, args);
}
}
直接启动springboot就行,注意还是要加上@EnableDubbo
3.编写api
package cn.ktp.auth.api;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import cn.ktp.auth.iservice.IAuthService;
@RestController
@RequestMapping(value = "ktp/api/auth")
public class KtpAuthApi {
@Reference
private IAuthService authService;
@RequestMapping(value="hello")
public String hello() {
return authService.hello();
}
}
调用Service跟原来spring的注入方式是一样的,注意这里的@Reference是dubbo提供的
4.启动KtpAuthConsumer,在浏览器输入http://localhost:7002/ktp/api/auth/hello
调用成功!
项目已经上传至https://gitee.com/krisdevhome/ktp-main
后续会逐步完善其他功能