SpringBoot 项目整合dubbo进行微服务开发-1

添加依赖

在springboot 项目中使用 dubbo ,除了必要的 spring 依赖意外,还需要两个依赖。

Dubbo依赖

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

和spring整合的依赖

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.3</version>
        </dependency>

配置

Dubbo的通用配置

不论是服务提供者,还是服务消费者,都需要进行这个配置

dubbo:
  application:
    name: dubbo-provider
  protocol:
    name: dubbo
    port: 20883
  registry:
    address: zookeeper://127.0.0.1:2181

这个配置表示使用 dubbo协议进行通信,使用 zookeeper 注册中心进行服务注册与发现

服务提供者配置

首先,需要在启动类上加上注解,开启 dubbo

@EnableDubbo
@EnableDubbo(scanBasePackages = "site.nihaoa.dubbo.services")

上面两种都行
在需要暴露的服务上,使用 @service 注解进行服务暴露与注册,interfaceClass可以写也可以不写

@Service(interfaceClass = IUserService.class)`在这里插入代码片`
@Component
public class UserServiceImpl implements IUserService {

    @Override
    public String getUserName(User user) throws Exception {
        return "This is UserService";
    }
}

注意: @service 注解不是spring 的注解,而是 dubbo 的注解

服务消费者配置

同样的,需要在启动类上加上注解,开启 dubbo

@EnableDubbo

在需要使用外部服务的地方使用注解进行注入

@Reference
    private IUserService userService;

下面是完整代码

@RestController
public class IndexController {
    @Reference
    private IUserService userService;

    @RequestMapping("/index")
    public String index() throws Exception{
        User user = new User();
        user.setAge(18);
        user.setName("abc");
        user.setNickName("def");
        user.setPasswd("123");
        System.out.println(userService.getUserName(user));
        return "Hello World";
    }
}

启动使用

报错

这个时候如果启动,可能会报错

java.lang.NoClassDefFoundError: org/apache/curator/framework/CuratorFrameworkFactory
	at org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperClient.<init>(CuratorZookeeperClient.java:65) ~[dubbo-2.7.3.jar:2.7.3]
	at org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperTransporter.createZookeeperClient(CuratorZookeeperTransporter.java:26) ~[dubbo-2.7.3.jar:2.7.3]
	at org.apache.dubbo.remoting.zookeeper.support.AbstractZookeeperTransporter.connect(AbstractZookeeperTransporter.java:68) ~[dubbo-2.7.3.jar:2.7.3]
	at org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter$Adaptive.connect(ZookeeperTransporter$Adaptive.java) ~[dubbo-2.7.3.jar:2.7.3]
	at org.apache.dubbo.configcenter.support.zookeeper.ZookeeperDynamicConfiguration.<init>(ZookeeperDynamicConfiguration.java:61) ~[dubbo-2.7.3.jar:2.7.3]
	at org.apache.dubbo.configcenter.support.zookeeper.ZookeeperDynamicConfigurationFactory.createDynamicConfiguration(ZookeeperDynamicConfigurationFactory.java:38) ~[dubbo-2.7.3.jar:2.7.3]
	at org.apache.dubbo.configcenter.AbstractDynamicConfigurationFactory.getDynamicConfiguration(AbstractDynamicConfigurationFactory.java:33) ~[dubbo-2.7.3.jar:2.7.3]
	at org.apache.dubbo.config.AbstractInterfaceConfig.getDynamicConfiguration(AbstractInterfaceConfig.java:314) ~[dubbo-2.7.3.jar:2.7.3]
	at org.apache.dubbo.config.AbstractInterfaceConfig.prepareEnvironment(AbstractInterfaceConfig.java:289) ~[dubbo-2.7.3.jar:2.7.3]
	at org.apache.dubbo.config.AbstractInterfaceConfig.startConfigCenter(AbstractInterfaceConfig.java:279) ~[dubbo-2.7.3.jar:2.7.3]
	at org.apache.dubbo.config.AbstractInterfaceConfig.lambda$null$7(AbstractInterfaceConfig.java:626) ~[dubbo-2.7.3.jar:2.7.3]
	at java.util.Optional.orElseGet(Optional.java:267) ~[na:1.8.0_192]
	at org.apache.dubbo.config.AbstractInterfaceConfig.lambda$useRegistryForConfigIfNecessary$8(AbstractInterfaceConfig.java:619) ~[dubbo-2.7.3.jar:2.7.3]
	at java.util.Optional.ifPresent(Optional.java:159) ~[na:1.8.0_192]
	at org.apache.dubbo.config.AbstractInterfaceConfig.useRegistryForConfigIfNecessary(AbstractInterfaceConfig.java:617) ~[dubbo-2.7.3.jar:2.7.3]
	at org.apache.dubbo.config.AbstractInterfaceConfig.checkRegistry(AbstractInterfaceConfig.java:207) ~[dubbo-2.7.3.jar:2.7.3]
	at org.apache.dubbo.config.ServiceConfig.checkAndUpdateSubConfigs(ServiceConfig.java:302) ~[dubbo-2.7.3.jar:2.7.3]
	at org.apache.dubbo.config.ServiceConfig.export(ServiceConfig.java:369) ~[dubbo-2.7.3.jar:2.7.3]
	at org.apache.dubbo.config.spring.ServiceBean.export(ServiceBean.java:336) ~[dubbo-2.7.3.jar:2.7.3]
	at org.apache.dubbo.config.spring.ServiceBean.onApplicationEvent(ServiceBean.java:114) ~[dubbo-2.7.3.jar:2.7.3]
	at org.apache.dubbo.config.spring.ServiceBean.onApplicationEvent(ServiceBean.java:60) ~[dubbo-2.7.3.jar:2.7.3]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) ~[spring-context-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) ~[spring-context-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) ~[spring-context-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:402) ~[spring-context-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:359) ~[spring-context-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:896) ~[spring-context-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:552) ~[spring-context-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:743) [spring-boot-2.1.7.RELEASE.jar:2.1.7.RELEASE]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:390) [spring-boot-2.1.7.RELEASE.jar:2.1.7.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) [spring-boot-2.1.7.RELEASE.jar:2.1.7.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1214) [spring-boot-2.1.7.RELEASE.jar:2.1.7.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1203) [spring-boot-2.1.7.RELEASE.jar:2.1.7.RELEASE]
	at site.nihaoa.dubbo.Dubbo3Application.main(Dubbo3Application.java:12) [classes/:na]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_192]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_192]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_192]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_192]
	at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) [spring-boot-devtools-2.1.7.RELEASE.jar:2.1.7.RELEASE]
Caused by: java.lang.ClassNotFoundException: org.apache.curator.framework.CuratorFrameworkFactory
	at java.net.URLClassLoader.findClass(URLClassLoader.java:382) ~[na:1.8.0_192]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_192]
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) ~[na:1.8.0_192]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_192]
	... 39 common frames omitted

所以还需要加入两个依赖

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

加上依赖之后,浏览器访问 http://127.0.0.1:8080/index
可以看到
结果

下面是完整的项目结构

首先创建了一个项目,然后在里面创建了三个Moudle.
base:里面放了服务的相关接口以及pojo类
api: 是对外接口,里面是controller,并且调用了服务提供者的服务
dubbo3: 服务提供者,实现了 base 里面的接口

项目架构

 base Moudle

API moudle

dubbo3 Moudle

服务消费者

//启动类
package site.nihaoa.dubbo.api;

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableDubbo
public class ApiApplication {

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

}

//controller 类
package site.nihaoa.dubbo.api.controller;

import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import site.nihaoa.dubbo.pojo.User;
import site.nihaoa.dubbo.service.IUserService;

@RestController
public class IndexController {
    @Reference
    private IUserService userService;

    @RequestMapping("/index")
    public String index() throws Exception{
        User user = new User();
        user.setAge(18);
        user.setName("abc");
        user.setNickName("def");
        user.setPasswd("123");
        System.out.println(userService.getUserName(user));
        return "Hello World";
    }
}

服务提供者

// 启动类
package site.nihaoa.dubbo;

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableDubbo(scanBasePackages = "site.nihaoa.dubbo.services")
public class Dubbo3Application {

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

}

//暴露的服务
package site.nihaoa.dubbo.services;


import org.apache.dubbo.config.annotation.Service;
import site.nihaoa.dubbo.pojo.User;
import site.nihaoa.dubbo.service.IUserService;


@Service
public class UserServiceImpl implements IUserService {

    @Override
    public String getUserName(User user) throws Exception {
        System.out.println(user);
        return "This is UserService";
    }
}

结果

服务调用成功
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值