一、为什么要用Dubbo
1.远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
2.软负载均衡及容错机制: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
3.服务自动注册与发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器
4.提供完善的管理控制台dubbo-admin与简单的控制中心dubbo-monitor
5.Dubbo提供了伸缩性很好的插件模型,很方便进行扩展(ExtensionLoader)
6.支持多协议
Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,
只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。
二、搭建SpringBoot+maven+Dubbo+Zookeeper(soa服务)
1、windows搭建zookeeper服务和启动服务
1>下载zookeeper,地址:http://apache.fayea.com/zookeeper/
2>解压下载的文件, 然后把解压后文件放到你要的位置。D:\zookeeper\zookeeper-3.4.11
3>进入D:\zookeeper\zookeeper-3.4.11\conf下,将里面的zoo_sample.cfg文件,做一个备份,然后改名为zoo.cfg,因为zookeeper启动后,只认识zoo.cfg中的所有设置和配置
4>在zoo.cfg中输入:
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=D:\\zookeeper\\zookeeper-3.4.11\\data
dataLogDir=D:\\zookeeper\\zookeeper-3.4.11\\log
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
5>在D:\zookeeper\zookeeper-3.4.11\下创建log和data文件夹(默认不创建会自动创建,自己创建以免万一)
6>使用cmd,进入D:\zookeeper\zookeeper-3.3.6\bin,运行zkServer.cmd,启动服务,如下图(port:2181是zookeeper的专用监听端口)。
三、springboot-dubbo-server
1>项目结构:
2、本文基于eclipse4.7.2+sts(springsource-tool-suite)+maven3.5.2搭建的,所以之前eclipse必须安装了sts和配置好了maven仓库,sts安装地址:https://jingyan.baidu.com/article/1612d5005fd087e20f1eee10.html。此处不累述了。
sts插件安装好之后.
1>File-new-other-SpringBoot-Spring Starter Project, Next.
2>填写相应的信息,Next
3>选择依赖web,Finish
4>pom.xml,注意:dubbo内部强制要用log4j,所以此处加上log4j的依赖
5>application.properties
spring.dubbo.application.name=provider
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
#dubbo 资源扫描文件
spring.dubbo.scan=com.hzg.boot.server.dubbo
#日志配置 dubbo强制内置log4j
#logging.config=classpath:logback-boot.xml
6>建立以下相关class
<1>EmployeeService
package com.hzg.boot.server.dubbo;
import com.hzg.boot.server.entity.Employee;
/**
* 员工服务层接口
* @author hzg1214
*
*/
public interface EmployeeService {
/**
* 根据员工姓名查询
* @param employeeName
* @return
*/
Employee queryEmployeeByName(String employeeName);
}
<2>EmployeeServiceImpl
package com.hzg.boot.server.dubbo.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.hzg.boot.server.dubbo.EmployeeService;
import com.hzg.boot.server.entity.Employee;
//注册为 Dubbo 服务 此@Service有dubbo提供
@Service(version="1.0.0")
public class EmployeeServiceImpl implements EmployeeService {
@Override
public Employee queryEmployeeByName(String employeeName) {
return new Employee(1,"上海","大城市");
}
}
<3>Employ
package com.hzg.boot.server.entity;
import java.io.Serializable;
/**
* 员工表
*
* @author hzg1214
*
*/
public class Employee implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private Integer id;
private String employee_name;
private String employee_age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getEmployee_name() {
return employee_name;
}
public void setEmployee_name(String employee_name) {
this.employee_name = employee_name;
}
public String getEmployee_age() {
return employee_age;
}
public void setEmployee_age(String employee_age) {
this.employee_age = employee_age;
}
@Override
public String toString() {
return "Employee [id=" + id + ", employee_name=" + employee_name + ", employee_age=" + employee_age + "]";
}
public Employee(Integer id, String employee_name, String employee_age) {
super();
this.id = id;
this.employee_name = employee_name;
this.employee_age = employee_age;
}
public Employee() {
super();
}
}
7>打包项目并运行,右击项目-Run As-Maven clean,成功之后在Run As-Maven build-Goals中输入compile,
启动SpringbootDubboServerApplication
四、搭建springboot-dubbo-client
搭建过程和server大致一样,此处不累述。
1、项目结构
2、相关添加的class
<1>application.properties
#防止服务消费者和提供者端口冲突(一致)
server.port=8888
## Dubbo 消费者
spring.dubbo.application.name=consumer
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.scan=com.hzg.boot.client.dubbo
<2>EmployeeService
package com.hzg.boot.client.dubbo;
import com.hzg.boot.client.entity.Employee;
/**
* 员工服务层接口
* @author hzg1214
*
*/
public interface EmployeeService {
/**
* 根据员工姓名查询
* @param employeeName
* @return
*/
Employee queryEmployeeByName(String employeeName);
}
<3>EmployeeConsumerService
package com.hzg.boot.client.dubbo;
import org.springframework.stereotype.Component;
import com.alibaba.dubbo.config.annotation.Reference;
import com.hzg.boot.client.entity.Employee;
/**
* dubbo 员工消费者
* @author hzg1214
*
*/
@Component
public class EmployeeConsumerService {
@Reference(version="1.0.0")
EmployeeService employeeService;
public EmployeeService getEmployeeService() {
return employeeService;
}
public void setEmployeeService(EmployeeService employeeService) {
this.employeeService = employeeService;
}
public void printEmployee() {
String employeeName = "上海";
if(employeeService == null){
System.out.println("employeeService 服务对象 为空");
}else {
Employee employee = employeeService.queryEmployeeByName(employeeName);
System.out.println(employee.toString());
}
}
}
<4>Employee
package com.hzg.boot.client.entity;
import java.io.Serializable;
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String employee_name;
private String employee_age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getEmployee_name() {
return employee_name;
}
public void setEmployee_name(String employee_name) {
this.employee_name = employee_name;
}
public String getEmployee_age() {
return employee_age;
}
public void setEmployee_age(String employee_age) {
this.employee_age = employee_age;
}
@Override
public String toString() {
return "Employee [id=" + id + ", employee_name=" + employee_name + ", employee_age=" + employee_age + "]";
}
public Employee(Integer id, String employee_name, String employee_age) {
super();
this.id = id;
this.employee_name = employee_name;
this.employee_age = employee_age;
}
public Employee() {
super();
}
}
<5>SpringbootDubboZookeeperClientApplication 中添加
package com.hzg.boot.client;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import com.hzg.boot.client.dubbo.EmployeeConsumerService;
@SpringBootApplication
public class SpringbootDubboZookeeperClientApplication {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(SpringbootDubboZookeeperClientApplication.class, args);
EmployeeConsumerService employeeService = run.getBean(EmployeeConsumerService.class);
employeeService.printEmployee();
}
}
<6>启动项目,和server一致。注意先启动server,在启动client
控制即会答应相应的信息。
---------------------
作者:hzg1214
来源:CSDN
原文:https://blog.csdn.net/hzg1214/article/details/79992693
版权声明:本文为博主原创文章,转载请附上博文链接!