dubbo官方文档中,API方式调用代码示例如下:
...以上有服务提供者协议配置代码,此处省略
// 服务提供者暴露服务配置
ServiceConfig<XxxService> service = new ServiceConfig<XxxService>(); // 此实例很重,封装了与注册中心的连接,请自行缓存,否则可能造成内存和连接泄漏
service.setApplication(application);
service.setRegistry(registry); // 多个注册中心可以用setRegistries()
service.setProtocol(protocol); // 多个协议可以用setProtocols()
service.setInterface(XxxService.class);
service.setRef(xxxService);
service.setVersion("1.0.0");
// 暴露及注册服务
service.export();
这里的自行缓存应该怎么做呢?
我们会有很多接口需要暴露为服务,每个服务要初始化一个ServiceConfig对象吗?看这个写法是要的(接口作为ServiceConfig的参数?),那怎么缓存呢?
请指教!谢谢!
可以用一个单例模式的对象,保存new创建的serviceconfig
class Singleton
{
private static ServiceConfig<XxxService> service = new ServiceConfig<XxxService>();
private Singleton() { }
public static ServiceConfig<XxxService> GetServiceConfig() { return service; }
}
谢谢!,但还是不明白:API方式在启动时扫描需要暴露的服务接口,每个服务接口创建一个ServiceConfig,然后就service.export()注册到注册中心,就能够被消费了,别的地方也没有再创建ServiceConfig的地方了,为什么要缓存呢?
同样,还有ReferenceConfig的缓存,启动时扫描要引用的服务接口,每个引用创建一个ReferenceConfig,然后referenceConfig.get()作为一个bean注入到这个类里,就可以调用服务了,为什么要缓存呢?哦,是指还有别的地方引用吗?这种情况确实可以缓存一下,所有引用服务的地方都注入同一个对象,那是不是应该缓存referenceConfig.get()而不是referenceConfig呢?
@Controller
public class DepartmentController {
//自定义注解,扫描注入dubbo服务引用
@AutowireDubbo
private UserService userService;
//本地服务
@Autowired
private DepartmentService departmentService;
@ResponseBody
@RequestMapping(value = "/department",method = RequestMethod.POST)
public RestResult add(@Valid @RequestBody Department department) {
Department restResult = departmentService.addDepartment(department);
//调用dubbo服务获取用户
restResult.setUserList(userService.getList(restResult.getDepartmentId());
return restResult;
}
}
这是实际调用的代码,userService是注入的referenceConfig.get()