• 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 创建服务提供者/生产者

    image-20200820164919929

    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启动测试

    首先启动提供者服务,然后再启动消费者服务,测试

  • 相关阅读:
    ssh事务配置
    使用注解实现事务处理
    c3p0、dbcp<转>
    添加业务层和事务机制
    使用spring集成hibernate
    使用Adivisor配置增强处理
    aop注解
    Spring IoC实现解耦合
    python console的命令执行
    python格式化输出
  • 原文地址:https://www.cnblogs.com/liqbk/p/13535942.html
Copyright © 2020-2023  润新知