Dubbo23_Dubbo相关配置说明6

一、包扫描

<dubbo:annotation package="com.itheima.service.impl" />
<dubbo:annotation package="com.itheima.controller" />

 服务提供者和服务消费者都需要配置,表示包扫描,作用是扫描指定包(包括子包)下的类。

 如果不使用包扫描,也可以通过如下配置的方式来发布服务-不推荐:

<bean id="helloService" class="com.itheima.service.impl.HelloServiceImpl" />
<dubbo:service interface="com.itheima.api.HelloService" ref="helloService" />

 作为服务消费者,可以通过如下配置来引用服务:

<!-- 生成远程服务代理,可以和本地bean一样使用helloService -->
<dubbo:reference id="helloService" interface="com.itheima.api.HelloService" />

 上面这种方式发布和引用服务,一个配置项(<dubbo:service>、<dubbo:reference>)只能发布或者引用一个服务,如果有多个服务,这种方式就比较繁琐了。

 推荐使用包扫描方式

二、协议

<dubbo:protocol name="dubbo" port="20880"/>

 一般在服务提供者一方配置,可以指定使用的协议名称和端口号。

 其中Dubbo支持的协议有:dubbo、rmi、hessian、http、webservice、rest、redis等。

 推荐使用的是dubbo协议

 dubbo 协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。

 也可以在同一个工程中配置多个协议,不同服务可以使用不同的协议,例如:

<!-- 多协议配置 -->
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:protocol name="rmi" port="1099" />
<!-- 使用dubbo协议暴露服务 -->
<dubbo:service interface="com.itheima.api.HelloService" ref="helloService" protocol="dubbo" />
<!-- 使用rmi协议暴露服务 -->
<dubbo:service interface="com.itheima.api.DemoService" ref="demoService" protocol="rmi" /> 

 如果协议不是dubbo,那么@Service注解需要加上协议写成:@Service(protocol="rmi")

三、启动时检查

<dubbo:consumer check="false"/>

 上面这个配置需要配置在服务消费者一方,如果不配置默认check值为true。Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时,能及早发现问题。可以通过将check值改为false来关闭检查。

 建议在开发阶段将check值设置为false(可以先启动consumer后启动provider),在生产环境下改为true。

四、负载均衡

 负载均衡(Load Balance):其实就是将请求分摊到多个操作单元上进行执行,从而共同完成工作任务。

 在集群负载均衡时,Dubbo 提供了多种均衡策略(包括随机、轮询、最少活跃调用数、一致性Hash),缺省为random随机调用。

 配置负载均衡策略,既可以在服务提供者一方配置,也可以在服务消费者一方配置,如下:

   @Controller
    @RequestMapping("/demo")
    public class HelloController {
        //在服务消费者一方配置负载均衡策略
        @Reference(check = false,loadbalance = "random")
        private HelloService helloService;

        @RequestMapping("/hello")
        @ResponseBody
        public String getName(String name){
            //远程调用
            String result = helloService.sayHello(name);
            System.out.println(result);
            return result;
        }
    }
//在服务提供者一方配置负载均衡
@Service(loadbalance = "random")
public class HelloServiceImpl implements HelloService {
    public String sayHello(String name) {
        return "hello " + name;
    }
}

 可以通过启动多个服务提供者来观察Dubbo负载均衡效果(先启动provider,然后更改provider项目中pom.xml里的tomcat端口号和配置文件applicationContext-service.xml中dubbo协议的端口号,并把service输出结果改了,再启动发现启动了2个providers)。

 注意:因为我们是在一台机器上启动多个服务提供者,所以需要修改tomcat的端口号和Dubbo服务的端口号来防止端口冲突。

  

 在实际生产环境中,多个服务提供者是分别部署在不同的机器上,所以不存在端口冲突问题。

 

posted on 2024-03-22 15:26  花溪月影  阅读(5)  评论(0编辑  收藏  举报