您的位置:首页 > 编程语言 > Java开发

由浅入深写java分布式(2) spring boot + dubbo + zookeeper详解

2017-02-17 13:16 826 查看
写了一份spring-boot + zoopkeeper + dubbo分布式调通的demo

生产者 git@github.com:WilliamGai/springboot_dubbo_provider.git

消费者 git@github.com:WilliamGai/springboot_dubbo_consumer.git

1.生产者

dubbo.properties配置文件

dubbo.application.name=application_hello
dubbo.application.logger=slf4j
#usage scena:  dubbo + zookeeper
dubbo.annotation.package=com.williamy.dubbo
dubbo.protocol.name=dubbo
dubbo.protocol.port=20883
dubbo.protocol.accessLog=true

dubbo.provider.timeout=3000

dubbo.provider.retries=1
dubbo.provider.delay=-1

dubbo.registr.protocol=zookeeper

dubbo.registry.address=123.56.13.70:2181
dubbo.registry.register=true
dubbo.registry.subscribe=true


dubbo配置

package com.williamy.dubbo.provider;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ProtocolConfig;
import com.alibaba.dubbo.config.ProviderConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.spring.AnnotationBean;
import com.alibaba.dubbo.rpc.Exporter;
import com.williamy.LogCore;

@Configuration
@ConditionalOnClass(Exporter.class)
@PropertySource(value = "classpath:/dubbo.properties")
public class DubboConfiguration {

@Value("${dubbo.application.name}")
private String applicationName;

@Value("${dubbo.registr.protocol}")
private String protocol;

@Value("${dubbo.registry.address}")
private String registryAddress;

@Value("${dubbo.protocol.name}")
private String protocolName;

@Value("${dubbo.protocol.port}")
private int protocolPort;

@Value("${dubbo.provider.timeout}")
private int timeout;

@Value("${dubbo.provider.retries}")
private int retries;

@Value("${dubbo.provider.delay}")
private int delay;

/**设置dubbo扫描包*/
@Bean
public static AnnotationBean annotationBean(@Value("${dubbo.annotation.package}") String packageName) {
AnnotationBean annotationBean = new AnnotationBean();
annotationBean.setPackage(packageName);
return annotationBean;
}

/**dubbo上下文*/
@Bean
public ApplicationConfig applicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName(this.applicationName);
return applicationConfig;
}

/** 注册zookeeper*/
@Bean
public RegistryConfig registryConfig() {
RegistryConfig registry = new RegistryConfig();
registry.setProtocol(protocol);
registry.setAddress(registryAddress);
return registry;
}

/**协议 */
@Bean
public ProtocolConfig protocolConfig() {
ProtocolConfig protocolConfig = new ProtocolConfig();
protocolConfig.setName(protocolName);
protocolConfig.setPort(protocolPort);
protocolConfig.setThreads(200);
LogCore.RPC.info("protocolConfig:{}", protocolConfig.hashCode());
return protocolConfig;
}

/**服务提供者*/
@Bean(name="myProvider")
public ProviderConfig providerConfig(ApplicationConfig applicationConfig, RegistryConfig registryConfig, ProtocolConfig protocolConfig) {
ProviderConfig providerConfig = new ProviderConfig();
providerConfig.setTimeout(timeout);
providerConfig.setRetries(retries);
providerConfig.setDelay(delay);
providerConfig.setApplication(applicationConfig);
providerConfig.setRegistry(registryConfig);
providerConfig.setProtocol(protocolConfig);
return providerConfig;
}
}
发布的服务
package com.williamy.dubbo;

import org.springframework.stereotype.Component;

import com.alibaba.dubbo.config.annotation.Service;
@Component
@Service(version="1.0.0")
public class HelloDubboService implements IHelloDubboService {
@Override
public String sayHello() {
return System.getProperty("user.dir")+System.getProperty("os.name");
}

}
public interface IHelloDubboService {
String sayHello();
}


然后mvn spring-boot:启动即可

2.消费者

dubbo.properties文件跟provider一样

接口

package com.williamy.dubbo;

public interface IHelloDubboService { String sayHello(); }
消费者是i用dubbo的@Reference来声明务必保证这个接口被dubbo扫描,应在dubbo.poperties配置的扫描包内
/**
* Reference会作为消费者寻找远程服务
*/
@Service
public class DubboServiceHandler {
@Reference(version="1.0.0")
public
IHelloDubboService helloservice;
}


使用

package com.williamy;

import java.util.Arrays;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.dubbo.config.annotation.Service;
import com.williamy.dubbo.IHelloDubboService;
import com.williamy.dubbo.DubboServiceHandler;

@Controller
@SpringBootApplication
public class App {

@Autowired
DubboServiceHandler testService;

@Reference(version="1.0.0")
IHelloDubboService helloservice;

@RequestMapping("/hello")
@ResponseBody
String testDubboDemo() {
return this.hashCode()+"Hello dubbo consumer a!"+testService.helloservice.sayHello();
}
public static void main(String[] args) throws Exception {
LogCore.BASE.info("app started={}",  Arrays.toString(args));
ConfigurableApplicationContext context = SpringApplication.run(App.class, args);
LogCore.BASE.info("app all services={}",(context.getBeansWithAnnotation(Service.class)));
LogCore.BASE.info("app all referens={}",(context.getBeansWithAnnotation(Reference.class)));
}

}


启动后测试

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring zookeeper dubbo linux