大体是分成三个项目跑通一个流程.
1:服务对外提供的api(对内是接口)
2:服务的实现(业务逻辑)
3:消费端消费
我的具体操作:
-
先创建一个maven的空项目作为父工程,用来框主服务端的两个项目(服务的API和API的实现)
1.1 如图
1.2 API项目详情(server-api):
pom.xml文件里没有啥,因为这个项目只是为了提供写接口.
我就写了一个接口用来演示public interface IHello { String hello(String msg); }
可以看到这代码啥也没有,没有任何springboot的注解,也没有dubbo相关的代码,就是简单.
1.3 服务的实现项目(server-provider):
pom引入包<!-- 引入自己写的server-api这个包,不然写实现的时候找不到这个借口类 --> <dependency> <groupId>com.qingnian</groupId> <artifactId>server-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!-- 引入spring-boot-starter以及dubbo和curator的依赖 --> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.2.0</version> </dependency> <!-- Spring Boot相关依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency>
application.yml 配置.
server: port: 8090 dubbo: application: #注册到注册中心的名称 name: server-provider #采用协议和端口号 protocol: #采用dubbo协议 name: dubbo #发布dubbo端口号为20880 port: 20880 registry: #注册中心地址,zk的集群一定要用backup连起来. address: zookeeper://192.168.9.100:2181?backup=192.168.9.101:2181,192.168.9.102:2181 spring: output: ansi: #日志 enabled: always
代码部分
实现类:消费端调用的是接口.就是由以下的实现类处理(如果你有多个实现类,消费端可以指定版本号来实现让那个实现类来做处理)import com.alibaba.dubbo.config.annotation.Service; /* * @Service是dubbo提供的不是spring的. * version:版本号.当前这个实现类的版本信息 */ @Service(version = "1.0") public class HelloImpl implements IHello { @Override public String hello(String msg) { System.out.println(msg); return msg; } }
springboot启动类
/*启动类主要就是加这个了,让dubbo的注解在代码里起作用,没有这个上面的那个server注解就起不到作用了*/ @EnableDubbo @SpringBootApplication public class ServerProviderApplication { public static void main(String[] args) { SpringApplication.run(ServerProviderApplication.class, args); } }
-
消费端项目
2.1. 消费端就直接起一个springboot项目
pom导包和上面的(server-provider)一样;
application.yml 配置也差不多,修改下端口号和注册名称就好dubbo: application: #注册到注册中心的名称 name: dubbo-client
代码部分了
@RestController public class MsgController { @Reference(version = "1.0") // 这个就是注入了IHello这个接口类的实现类(看:带了版本号,这个借口可能会有多个实现类.版本号就很好用了) private IHello helloImpl; @ResponseBody @RequestMapping("/") public Object hi(String msg){ helloImpl.hello(msg); // 这不就和注入server层代码一样的用了嘛 return msg; } }
springboot启动类也和(server-provider)一样;
好了,简单的流程就到这里了.当然实现类里的那个@server里还有很多dubbo的参数可以填,比如超时时间,啥的,例子就举了个版本号为例子.同理消费端的@Reference也是一样.
这里问题就来了:如果服务端的@server和消费端的@Reference配置了相同的配置,那么以那边为准呢?
答案就是:以消费端为准.好比你去买奶茶,商家推荐你买大或中或小三个杯子的奶茶,你买奶茶当然是当然是你做主,你说买啥杯就买啥杯(当然罗永浩和星巴克的那次除外).
下面介绍dubbo注解常用参数了
参数 | 意思 |
---|---|
官网地址 | http://dubbo.apache.org/zh-cn/docs/user/references/xml/dubbo-service.html |
version | 版本号:(version = “1.0”) |
cluster | 集群容错机制:(cluster = “failfast”) |
↑可选参数解释 | failover(默认:重试其他服务器.retries:重试次数) / failfast(失败立马报错) / failsafe(安全失败:不在乎这个错误,但是记录日志) / failback( 失败自动恢复) / forking(并行调用多个服务,只要一个成功即返回.forks:并行数) |
timeout | 超时时间:(timeout = 1000) 单位是毫秒 |
mock | 服务降级(比如超时,网络异常等触发):(mock = “com.qingnian.dubboClient.Controller.IHelloMock”) |
↑解释 | 比如说某根据用户习惯查询推荐的API设置了超时时间,执行时刚好超过所设置的超时时间(比如者服务端挂了导致超时),这时候你无法活的到针对用户的推荐,这时候你又不想直接报错.这时候就可以走mock指定的本地路径方法返回一些通用的推荐(mock指定的方法也是实现了同一个接口的类) |
loadbalance | 负载均衡策略:(loadbalance =“roundrobin”) |
↑可选参数解释 | random(随机),roundrobin(轮询),leastactive(最少活跃) |