79--JT项目17(Dubbo框架入门)
1.dubbo框架介绍
1.1 dubbo介绍
Apache Dubbo |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
1.2 dubbo工作原理
核心的思想就是代理思想
1.3 dubbo入门案例
1.3.1 将项目导入工作空间
说明:将课前资料中的项目导入工作空间中,或者直接创建项目也可以
2).修改pom.xml文件配置
1.3.2导入项目
1).导入现有项目
2).选择dubbo入门案例
3).选择模板
4).导入成功
1.3.3 切换maven私服地址
1.3.4 添加jar包文件
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
1.3.5 创建第三方接口
1).项目结构
2).定义POJO实体对象
说明:关于实体对象 必须实现序列号接口 因为需要在网络中实现对象数据的传输.
package com.jt.dubbo.pojo;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain=true)
@TableName //如果对象名称与表名一致,则可以省略不写.
public class User implements Serializable{
//dubbo协议中传输的对象必须序列化
private static final long serialVersionUID = 1L;
@TableId(type=IdType.AUTO)
private Integer id;
private String name;
private Integer age;
private String sex;
}
3).定义第三方接口
package com.jt.dubbo.service;
import java.util.List;
import org.springframework.transaction.annotation.Transactional;
import com.jt.dubbo.pojo.User;
public interface UserService {
//查询全部的用户信息
List<User> findAll();
//新增用户入库操作.
@Transactional
void saveUser(User user);
}
1.3.6 创建服务提供者/生产者
1.3.6.1 添加依赖项于提供者pom.xnl文件中
<!--提供者需要实现第三方接口,则必须依赖第三方项目-->
<dependencies>
<dependency>
<groupId>com.jt.dubbo</groupId>
<artifactId>dubbo-jt-demo-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
1.3.6.2 编辑提供者Service实现类
package com.jt.dubbo.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import com.alibaba.dubbo.config.annotation.Service;
import com.jt.dubbo.mapper.UserMapper;
import com.jt.dubbo.pojo.User;
@Service(timeout=3000) //3秒超时 内部实现了rpc com.alibaba.dubbo.config.annotation
//@org.springframework.stereotype.Service//将对象交给spring容器管理
public class UserServiceImpl implements UserService {//实现公共的第三方接口
//userService接口只是定义规范.不负责具体的实现.将来由服务的提供者实现该功能.
@Autowired
private UserMapper userMapper;
@Override
public List<User> findAll() {
System.out.println("我是第一个服务的提供者");
return userMapper.selectList(null);
}
@Override
public void saveUser(User user) {
userMapper.insert(user);
}
}
1.3.6.3 编辑提供者的YML配置文件
server:
port: 9000 #定义端口
spring:
datasource:
#引入druid数据源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
password: 1234
#关于Dubbo配置
dubbo:
scan:
basePackages: com.jt #指定dubbo的包路径 扫描dubbo的注解
application: #应用名称
name: provider-user #一个接口对应一个服务名称 相同的接口服务名称必定一 致. 不同的接口服务名称- 一定不一致.
registry: #配置注册中心
address: zookeeper://192.168.126.129:2181?backup=192.168.126.129:2182,192.168.126.129:2183
protocol: #指定协议
name: dubbo #使用dubbo协议(tcp-ip) web-controller直接调用sso-Service
port: 20880 #每一个服务都有自己特定的端口 不能重复.
mybatis-plus:
type-aliases-package: com.jt.dubbo.pojo #配置别名包路径
mapper-locations: classpath:/mybatis/mappers/*.xml #添加mapper映射文件
configuration:
map-underscore-to-camel-case: true #开启驼峰映射规则
1.3.6.4 主启动类测试
1.3.7 配置服务消费者
1.3.7.1 添加依赖于消费者pom.xml文件中
<dependencies>
<dependency>
<groupId>com.jt.dubbo</groupId>
<artifactId>dubbo-jt-demo-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
1.3.7.2 消费者的代码结构
1.3.7.3 编辑UserController
package com.jt.dubbo.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.jt.dubbo.pojo.User;
import com.jt.dubbo.service.UserService;
@RestController
public class UserController {
////利用dubbo的方式为接口创建代理对象 利用rpc调用
//定义第三方接口 com.alibaba.dubbo.config.annotation
//利用代理机制为其创建代理对象,用起来和本地服务一样,实质调用的是远程服务
//(loadbalance="leastactive")
@Reference
private UserService userService;
/**
* Dubbo框架调用特点:远程RPC调用就像调用自己本地服务一样简单
* @return
*/
@RequestMapping("/findAll")
public List<User> findAll(){
//远程调用时传递的对象数据必须序列化.
return userService.findAll();
}
@RequestMapping("/saveUser/{name}/{age}/{sex}")
public String saveUser(User user) {
userService.saveUser(user);
return "用户入库成功!!!";
}
}
1.3.7.4 编辑YML配置文件
server:
port: 9001
dubbo:
scan:
basePackages: com.jt
application:
name: consumer-user #定义消费者名称
registry: #注册中心地址
address: zookeeper://192.168.126.129:2181?backup=192.168.126.129:2182,192.168.126.129:2183
1.4 问题说明
问题1: 如果其中的一个提供者宕机,问 用户访问是否受限??? 不受限
问题2: 如果zk集群宕机,问用户访问是否受限??? 不受影响(原因:已经讲服务列表进行了同步) 但是现在处于风险中.应该尽快修复.
1.5启动测试
首先启动提供者服务,然后再启动消费者服务,测试