基于springboot的框架搭建(mybatis(mysql)+rocketmq+redis+dubbo)

358 阅读1分钟

基础框架

先从 start.spring.io/ 上面下载初始框架 生成之后解压导入idea

  • 先配置好端口号
  • 写个测试Controller类,看项目是否能正常启动 访问都正常,进行第二步

集成数据库,这里用到的是mybatis

首先引入mybatis和mysql相关的jar包

		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>${mybatis.version}</version>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>

接着增加mysql的配置:

spring.datasource.username = {your.usernmae}
spring.datasource.password = {your.password}
spring.datasource.url = jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=true\
  &serverTimeZone=UTC
drive-class-name = com.mysql.jdbc.Driver

最后上代码就可以了

控制层: 服务层: dao层: 测试结果:

集成RocketMQ

先部署好rocketmq环境,我采用的是docker安装 安装步骤参考:www.cnblogs.com/kiwifly/p/1… maven依赖

<dependency>
	<groupId>org.apache.rocketmq</groupId>
	<artifactId>rocketmq-spring-boot-starter</artifactId>
    <version>2.0.3</version>
</dependency>

安装完毕后,准备配置文件:

追加mq-》 spring.profiles.include = db,mq 指定nameserver和生产组名称

写生产者测试类:

@RequestMapping("produce")
public class ProduceController {

    @Resource
    RocketMQTemplate rocketMQTemplate;

    @PostMapping("send")
    public void sendMessage() {
        Message message = Message.builder().id(UUID.randomUUID().toString()).message("send " +
                "message").build();

        rocketMQTemplate.convertAndSend("test-send", message);
        System.out.println("生产者发送消息成功,消息内容" + message.toString());
    }
}

@Data
@Builder
public class Message {

    private String id;

    private String message;
}

写消费者测试类:

@Service
@RocketMQMessageListener(consumerGroup = "demo-group", topic = "test-send")
public class TestSendConsumer implements RocketMQListener<Message> {
    @Override
    public void onMessage(Message message) {
        System.out.println("消费者接收到消息" + message.toString());
    }
}

运行结果:

集成redis

安装redis环境,这里也是在docker下安装,参考: www.runoob.com/docker/dock…

引入依赖:

    <dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-data-redis</artifactId>
	</dependency>
    <dependency>
    	<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
	</dependency>

追加redis配置文件: spring.profiles.include = db,mq,redis。redis配置如下:

spring.redis.host= 127.0.0.1
spring.redis.port=6379
# Redis 数据库索引(默认为 0)
spring.redis.database=0 
# Redis 服务器连接端口
# Redis 服务器连接密码(默认为空)
spring.redis.password=
#连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=0

创建redis工具类,简单示例:

@Component
@Slf4j
public class RedisUtils {

    @Resource
    private RedisTemplate redisTemplate;


    /**
     * 普通缓存key获取
     *
     * @param key 缓存key
     * @return
     */
    public Object get(String key) {
        return key == null ? null : redisTemplate.opsForValue().get(key);
    }

    /**
     * 设置键值
     *
     * @param key 键
     * @param value 值
     * @return
     */
    public boolean set(String key, Object value) {
        try {
            redisTemplate.opsForValue().set(key, value);
            return true;
        } catch (Exception e) {
            log.error("设置键值失败,", e);
            return false;
        }
    }
  }

写个测试controller观察一下:

/**
 * @author lbb
 * @date 2020/12/8 4:19 下午
 */
@RestController
@RequestMapping("/redis/")
public class RedisController {

    @Resource
    private RedisUtils redisUtils;

    @PostMapping("set")
    public void set() {
        redisUtils.set("test", "testSet");
        System.out.println(redisUtils.get("test"));
    }
}

控制台打印出值: 代表集成成功,具体redis还有很多方法,这里不一一列举。

集成dubbo

首先,安装zookeeper,我采用docker安装zk

docker pull zookeeper
docker run --privileged=true -d --name zookeeper --publish 2181:2181 -d zookeeper:latest

这样就算启动成功了。 然后引入jar包:

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.7.6</version>
</dependency>

接着增加dubbo配置,我的配置如下:

然后创建接口:

public interface IFacade {
    void testDubbo();
}

提供者实现接口,注意要引dubbo的包:

模拟消费者消费:

package com.lbb.demo.consume;

import com.lbb.demo.facade.IFacade;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Component;

/**
 * @author lbb
 * @date 2020/12/9 9:03 下午
 */
@Component
public class ConsumeDubbo {

    @Reference(check = false, timeout = 5000)
    private IFacade facade;

    private void consume() {
        facade.testDubbo();
    }
}

写个测试controller:

package com.lbb.demo.controller;

import com.lbb.demo.consume.ConsumeDubbo;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;

/**
 * @author lbb
 * @date 2020/12/10 6:19 下午
 */
@RestController
@RequestMapping("/dubbo/")
public class DubboController {

    @Resource
    private ConsumeDubbo consumeDubbo;

    @PostMapping("test")
    public void testDubbo() {
        consumeDubbo.consume();
    }
}

最重要的一步,记得在启动类加上@EnableDubbo

@SpringBootApplication
@EnableDubbo
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}

}

最后启动项目,调用接口,发现启动报错:The bean 'dubboBootstrapApplicationListener' could not be registered. A bean with that name has already been defined and overriding is disabled.

根据建议解决,在配置文件加上spring.main.allow-bean-definition-overriding=true 再次启动,一度又失败了:

2020-12-10 18:41:30.513 ERROR 74037 --- [ main] o.s.boot.SpringApplication : Application run failed

java.lang.NoClassDefFoundError: org/apache/curator/RetryPolicy at org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperTransporter.createZookeeperClient(CuratorZookeeperTransporter.java:26) ~[dubbo-2.7.6.jar:2.7.6] 引入包:

 <dependency>
	<groupId>org.apache.curator</groupId>
        <artifactId>curator-framework</artifactId>
  	<version>4.0.1</version>
 </dependency>

又出现:java.lang.NoClassDefFoundError: org/apache/curator/framework/recipes/cache/TreeCacheListener 再引入包:

  <dependency>
	<groupId>org.apache.curator</groupId>
        <artifactId>curator-recipes</artifactId>
	<version>${curator.version}</version>
  </dependency>

即可解决问题,测试我们的接口,按预期打印出结果,证明dubbo服务集成完成。

总结

整篇下来内容比较多,有时候自己去集成一些组件,才能在过程中踩坑成长,有些坑没有明说原因,感兴趣的同学可以自行研究。