个人项目 AngBoot 使用的是 SpringSecurity 作权限管理与认证, 可是, 项目初衷是做为开发模板结构, 因此, 为了应对微服务以及更灵活的使用场景, 我引入了 Dubbo 以提供远程认证服务. 这样, 能够经过修改配置很容易的从我内嵌的认证系统迁移到任何一个开发者本身的认证系统.html
今天在本身项目中引入 Dubbo 时遇到一个问题, 项目自己是 SpringBoot 项目, 若是须要 Dubbo 就可使用
@EnableDubbo
以及注解配置的方式方便的引入 Dubbo 到 SpringBoot 环境, 可是, 个人需求是须要配置化,灵活, 动态的引入 Dubbo rpc 远程服务, 简单的说就是默认使用内嵌的模块, 可是依然能够经过配置使用远程服务, 因此直接为 SpringBoot 添加@EnableDubbo
直接的方式使用 Dubbo 显得并非那么合适, 由于默认并无远程调用git参看 Dubbo 文档能够发现Dubbo 的 API 配置方式, 可是官网写的比较粗糙, 可是直觉猜想应该是能够把
ApplicationConfig
,RegistryConfig
等对象放入 IOC 中, 而后经过ReferenceConfig
将远程对象拿到并加入 IOC 中, 这样就不会对其余模块和代码产生影响. 因此写个 exmaple 进行验证.github
服务提供者无所谓那种配置方式, 咱们就用最快最简单的 SpringBoot +
@EnableDubbo
注解进行配置.spring
@SpringBootApplication
@EnableDubbo
public class ProviderTicketApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderTicketApplication.class, args);
}
}复制代码
package com.jack.ticket.service;
public interface TicketService {
public String getTicket();
}
复制代码
package com.jack.ticket.service;
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
@Component // 将服务加入 IOC
@Service // 将服务发布出去
public class TicketServiceImpl implements TicketService {
@Override
public String getTicket() {
return "厉害了, 个人国....";
}
}复制代码
dubbo.application.name=provider-ticket
# 注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
# 包扫描须要提供的服务
dubbo.scan.base-packages=com.jack.ticket.service复制代码
ProviderTicketApplication
@SpringBootApplication
public class ConsumerUserApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerUserApplication.class, args);
}
}复制代码
package com.jack.ticket.service;
public interface TicketService {
String getTicket();
}复制代码
package com.jack.user.config;
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ReferenceConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.jack.ticket.service.TicketService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DubboConfiguration {
/**
* 建立 ApplicationConfig 对象.
* 将其加入 IOC 并非必须的, 由于只有在获取远程对象时才须要该实例,
* 所以, 当远程服务较多须要屡次获取时将该实例加入 IOC 才显得有必要,
* 固然, 你也能够将其做为成员属性持有复用.
*/
@Bean
public ApplicationConfig applicationConfig() {
ApplicationConfig application = new ApplicationConfig();
application.setName("consumer-user");
return application;
}
/**
* 建立 RegistryConfig 以配置注册中心信息.
* @see DubboConfiguration#applicationConfig() 一样的加入 IOC 不是必须的
*/
@Bean
public RegistryConfig registryConfig() {
RegistryConfig registry = new RegistryConfig();
registry.setAddress("zookeeper://127.0.0.1:2181");
return registry;
}
/**
* 获取远程服务对象.
* 实际上, 若是远程对象只调用一次, 也没有必要加入 IOC, 在使用时获取一次就行了,
* 可是大部分场景都是须要屡次重复调用的, 并且获取远程服务对象的代价昂贵, 因此,
* 将其加入 IOC 容器以复用很明显是较好实践, 获取能够自行缓存.
*/
@Bean
public TicketService ticketService() {
// 此实例很重,封装了与注册中心的链接以及与提供者的链接,请自行缓存,不然可能形成内存和链接泄漏
ReferenceConfig<TicketService> reference = new ReferenceConfig<>();
reference.setApplication(applicationConfig());
// 多个注册中心能够用setRegistries()
reference.setRegistry(registryConfig());
reference.setInterface(TicketService.class);
// 和本地bean同样使用 TicketService
// 注意:此代理对象内部封装了全部通信细节,对象较重,请缓存复用
TicketService ticketService = reference.get();
return ticketService;
}
}复制代码
因为远程服务对象已经被获取并加入到当前 IOC 中, 因此就能够经过
@Autowired
进行依赖注入.apache
package com.jack.user.service;
import com.jack.ticket.service.TicketService;
import org.springframework.stereotype.Service;
@Service
public class UserService {
public final TicketService ticketService;
public UserService(TicketService ticketService) {
this.ticketService = ticketService;
}
public void buyTicket() {
String ticket = ticketService.getTicket();
System.out.println("买到票了, ticket: " + ticket);
}
}复制代码
package com.jack.user.service;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTests {
@Autowired
private UserService userService;
@Test
public void testBuyTicket() {
Assert.assertNotNull("init user service failed...", userService);
userService.buyTicket();
}
}复制代码
至此, Dubbo 的 API 配置方式就介绍完了, 咱们能够在 Spring/SpringBoot 环境中方便的使用和配合 Spring 的 Conditional 灵活的进行扩展式编程以是本身的项目/产品能够应对更多使用场景.编程
更多请关注个人项目 AngBootapi
平常求赞: 欢迎你们点赞, 评论, 关注, 转发. 要是能给点赞扬就更好了, 哈哈哈.... blog.csdn.net/DreamLi1314缓存