springboot整合使用dubbo大体分为三大部分
暴露的API接口(dubbo-interface-API)
服务的提供者(dubbo-service-provider)
服务的消费者(dubbo-service-consumer)
下面是实现细节
1.对外暴露的API接口(dsubbo-interface-API)
对于接口工程的创建 使用了maven 但没使用任何骨架
目录结构为一个实体类和一个服务接口
实体类的创建要注意实现对象的序列化 (实现Serializable 接口)
public class Student implements Serializable {
private static final long serialVersionUID = 1245946014621298931L;
private Integer id;
private String name;
private int age;
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public interface StudentService {
Student queryStudent(String name);
int addStudent(Student student);
}
2.服务的提供者(dubbo-service-provider)
对于服务的提供者 这里创建使用了maven的spring Initializr?添加了一大部分的springboot起步依赖?
(mysql驱动 mybatis框架 redis驱动等起步依赖)
?
2.1 处理pom文件
对于暴露接口工程/dubbo/zookeeper的依赖还需要手动添加
<!--公共项目的依赖-->
<dependency>
<groupId>XXXXXX.XXXXXX</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0.0</version>
</dependency>
<!--dubbo起步依赖-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</version>
</dependency>
<!--zookeeper依赖-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>2.7.8</version>
<type>pom</type>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
框架自动生成pom文件中的一些内容
2.2编写StudentDao接口
StudentDao接口来写业务的查询和添加功能
public interface StudentDao {
Student selectStudentByName(@Param("name")String name);
int insertStudent(Student student);
}
2.3处理mybatis.xml?文件
实现Dao接口的映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--指定dao接口的全限定名称-->
<mapper namespace="xxx.xxxxxxx.Dao.StudentDao">
<select id="selectStudentByName" resultType="com.xxxxxx.model.Student">
select * from student where name=#{name}
</select>
<insert id="insertStudent">
insert into student(name ,age) values(#{name},#{age})
</insert>
</mapper>
2.4处理StudentServer接口的实现类---StudentServerImpl
@DubboService(interfaceClass = StudentService.class,version = "1.0",timeout = 5000)
public class StudentServiceImpl implements StudentService {
@Resource
private RedisTemplate redisTemplate;
@Resource
private StudentDao studentDao;
/**
*
* @param student
* @return int
* 初始值:0
* 添加成功:1
* 姓名已存在:2
* 姓名不能为空:3
*/
@Override
public int addStudent(Student student) {
int result = 0;
if(student.getName() != null){
Student stu =studentDao.selectStudentByName(student.getName());
//应该是student不应该是student.getName() 不然会空指针
if(stu.getName() != null){
result = 2;
}else{
result =studentDao.insertStudent(student);
}
}else {
result = 3;
}
return result;
}
//查询时会出现缓存穿透的现象
@Override
public Student queryStudent(String name) {
//对键值分别序列化
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Student.class));
Student student = null;
final String USER_KEY="STUDENT:";
if(name != null){
String key = USER_KEY + name;
student = (Student) redisTemplate.opsForValue().get(key);
System.out.println("从redis查数据" + student);
if(student == null){
student = studentDao.selectStudentByName(name);
System.out.println("从数据库查数据" + student);
if(student != null){
redisTemplate.opsForValue().set(key,student);
}else {
redisTemplate.opsForValue().set(key,Student.defaultStudent());
}
}
}
return student;
}
}
@DubboService(interfaceClass = StudentService.class,version = "1.0",timeout = 5000)
实现dubbo服务 设置需要的暴露的公共项目 版本号 超时等属性
@Resource:private RedisTemplate redisTemplate;
使用redis需要的注解 通过RedisTemplate封装好的各种方法来操作Redis 进行序列化 反序列化等
@Resource:private StudentDao studentDao;
spring实现自动注入
2.5处理application.properties文件
#配置dubbo
spring.application.name=dubbo-provider
dubbo.scan.base-packages=xxx.xxxxxxx.service
dubbo.registry.address=zookeeper://localhost:2181
#配置redis
#redis部署在Linux上 使用虚拟机的ip 未使用密码
spring.redis.host=192.168.xxx.xxx
spring.redis.port=6379
#配置mybatis
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#配置mysql数据源
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=0120
mybatis.mapper-locations=classpath:mapper/*.xml---->通过主配置文件使mybatis找到mapper文件的位置
2.6 处理springboot主启动项
@SpringBootApplication
@EnableDubbo
@MapperScan(basePackages = "com.xxxxxx.Dao")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@SpringBootApplication
使用springboot核心注解(复合注解)
@EnableDubbo
启用dubbo服务
@MapperScan(basePackages = "com.xxxxxx.Dao")
(使用mybatis时 把Dao接口与java文件分开存储)
再配置注解对包进行扫描---->通过springboot主类找到接口位置
....................................未完成
|