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

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

原文地址:https://www.cnblogs.com/liqbk/p/13535942.html