CGB2005 0916 jt17

上午

1.HttpClient远程调用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
9.27 为什么是User对象
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
sso编写
在这里插入图片描述
在这里插入图片描述
分析
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

自我实现

步骤
在这里插入图片描述

web服务器 脚手架

controller层
在这里插入图片描述
在这里插入图片描述
service层
在这里插入图片描述
在这里插入图片描述

sso服务器 脚手架

controller层

service层
在这里插入图片描述
在这里插入图片描述

效果实现

在这里插入图片描述
分析
在这里插入图片描述

整体跨域流程(微服务开发)

在这里插入图片描述

在这里插入图片描述
字符串是因为 返回的是json 要返回成对象才行

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

想让业务代码简化

Dubbo SOA思想

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
RPC
在这里插入图片描述
如何给老婆解释什么是RPC
一个阳光明媚的早晨,老婆又在翻看我订阅的技术杂志。
“老公,什么是RPC呀,为什么你们程序员那么多黑话!”,老婆还是一如既往的好奇。
“RPC,就是Remote Procedure Call的简称呀,翻译成中文就是远程过程调用嘛”,我一边看着书,一边漫不经心的回答着。
“啥?你在说啥?谁不知道翻译成中文是什么意思?你个废柴,快给我滚去洗碗!”
“我去。。。”,我如梦初醒,我对面坐着的可不是一个程序员,为了不去洗碗,我瞬间调动起全部脑细胞,星辰大海在我脑中汇聚,灵感涌现…
“是这样,远程过程调用,自然是相对于本地过程调用来说的嘛。”
“嗯哼,那先给老娘讲讲,本地过程调用是啥子?”
“本地过程调用,就好比你现在在家里,你要想洗碗,那你直接把碗放进洗碗机,打开洗碗机开关就可以洗了。这就叫本地过程调用。”
“哎呦,我可不干,那啥是远程过程调用?”
“远程嘛,那就是你现在不在家,跟姐妹们浪去了,突然发现碗还没洗,打了个电话过来,叫我去洗碗,这就是远程过程调用啦”,多么通俗易懂的解释,我真是天才!
“哦!我明白了”,说着,老婆开始收拾包包。
“你这是干啥去哦”
“我?我要出门浪去呀,待会记得接收我的远程调用哦,哦不,咱们要专业点,应该说,待会记得接收我的RPC哦!”
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

微服务架构思考 分布式思想

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最重要的就是注册中心 只有有服务器没down 整个系统就不会崩溃

11.55 开车

在这里插入图片描述
下午 搭建注册中心

Zookeeper

1.1.1Zookeeper介绍
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
ZooKeeper包含一个简单的原语集,提供Java和C的接口。
ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在zookeeper-3.4.3\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。
总结:Zookeeper负责服务的协调调度.当客户端发起请求时,返回正确的服务器地址.
在这里插入图片描述
上传zookeeper
在这里插入图片描述
解压
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
把文件目录复制一份

/usr/local/src/zookeeper/data

进入找到文件案例
在这里插入图片描述
复制一份
在这里插入图片描述
进入修改
在这里插入图片描述
clientPort 客户端端口
在这里插入图片描述
bin中启动服务
在这里插入图片描述
在这里插入图片描述

集群说明

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
不能站在宕机的角度上考虑问题

公式: 剩余的主节点 > N/2在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
也要同时满足公式才行

分析:
1个节点能否搭建集群? 1-1 > 0.5 假 不能搭建集群
2个节点能否搭建集群? 2-1 > 1 假 不能搭建集群
3个节点能否搭建集群? 3-1 > 1.5 真 可以搭建集群
4个节点能否搭建集群> 4-1 > 2 真 可以搭建集群

分析集群宕机的条件:
3个节点最多允许宕机1台. 奇数
4个节点最多允许宕机1台 偶数
奇数台和偶数台容灾能力相同.所以为了节省资源,一般集群都是奇数台.

结论:1).搭建集群最小单位 3台.
2).一般集群搭建都是奇数台.

在这里插入图片描述
在这里插入图片描述
新建集群文件夹
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总结
在这里插入图片描述
在这里插入图片描述
各自的状态
在这里插入图片描述
集群命令:

在/usr/local/src/zookeeper/bin下
在这里插入图片描述

启动服务:sh zkServer.sh start zoo1.cfg
查看服务状态:sh zkServer.sh status zoo1.cfg
暂停服务:sh zkServer.sh stop zoo1.cfg

在如下图创建并复制修改
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ZK选举机制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

面试题

在这里插入图片描述
现有的节点数量 > N/2
问题1: 7/2=3.5 只要有4台机就可以搭建集群 4台才可以工作 4节点有3票
问题2: 按顺序 4down 后 7down 6down 5不能down 必须保持4个节点才行

dubbo框架介绍

5.1 dubbo介绍
Apache Dubbo |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现在这里插入图片描述
dubbo或者springcloud(和注册中心原理图一模一样)

dubbo工作原理

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
导包导dubbo的包
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
面试题
在这里插入图片描述
不受影响

注册中心 zookeeper干的活
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Dubbo入门案例

2.6.1 导入项目方式在这里插入图片描述
导入项目在这里插入图片描述
在这里插入图片描述
2.6.3 定义公共的第三方接口项目
在这里插入图片描述
2.6.3

提供者的说明

2.6.3.1 编辑Dubbo实现类

package com.jt.dubbo.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.jt.dubbo.mapper.UserMapper;
import com.jt.dubbo.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;
@Service(timeout=3000)	//3秒超时 内部实现了rpc
//@org.springframework.stereotype.Service//将对象交给spring容器管理
public class UserServiceImpl implements 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);
	}
}


2.6.3.2 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: root

#关于Dubbo配置   
dubbo:
  scan:
    basePackages: com.jt    #指定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                #开启驼峰映射规则

2.6.4 服务消费者说明

2.6.4.1 编辑Controller层

package com.jt.dubbo.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.jt.dubbo.pojo.User;
import com.jt.dubbo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class UserController {
	
	利用dubbo的方式为接口创建代理对象 利用rpc调用
	//check=false 先启动提供者/消费者没有关系
	@Reference(check = false,timeout = 3000) //(loadbalance="leastactive")
	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 "用户入库成功!!!";
	}
}


2.6.4.2 编辑消费者的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

2.6.4.3 消费者启动测试

在这里插入图片描述

自我实现:微服务架构demo

原理:
在这里插入图片描述

前提:在这里插入图片描述
架构脚手架搭建

优先:定义公共的第三方接口项目 面向接口编程 接口中立

在这里插入图片描述
接口只定义准则 至于谁去实现就不管
在这里插入图片描述
额外的点 面向接口编程 controller层和实现类后端层与接口的关系都是依赖的关系

controller层
在这里插入图片描述

实现类 impl

在这里插入图片描述

先有提供者再有消费者!!!

提供者的说明 编写

提供者1

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: root

#关于Dubbo配置   
dubbo:
  scan:
    basePackages: com.jt    #指定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                #开启驼峰映射规则

在这里插入图片描述

#关于Dubbo配置   
dubbo:
  scan:
    basePackages: com.jt    #指定dubbo的包路径

包扫描主要是扫描包下面的实现类

在这里插入图片描述

 protocol:  #指定协议
    name: dubbo  #使用dubbo协议(tcp-ip)  web-controller直接调用sso-Service
    port: 20880  #每一个服务都有自己特定的端口 不能重复.

编辑Dubbo实现类1

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
//@org.springframework.stereotype.Service//将对象交给spring容器管理
public class UserServiceImpl implements 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);
	}
}

在这里插入图片描述
把对象传过来 直接入库就行 调用远程服务就像调用自家服务一样

dao层

package com.jt.dubbo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jt.dubbo.pojo.User;

public interface UserMapper extends BaseMapper<User>{
	
}

提供者2

server:
  port: 9003

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: root

dubbo:
  scan:
    basePackages: com.jt
  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
    port: 20882 #每个服务都应该有自己独立的端口


mybatis-plus:
  type-aliases-package: com.jt.dubbo.pojo       #配置别名包路径
  mapper-locations: classpath:/mybatis/mappers/*.xml  #添加mapper映射文件
  configuration:
    map-underscore-to-camel-case: true                #开启驼峰映射规则

编辑Dubbo实现类1

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秒超时	
public class UserServiceImpl implements 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);
	}

}

dao层

package com.jt.dubbo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jt.dubbo.pojo.User;

public interface UserMapper extends BaseMapper<User>{
	
}

web服务消费者 只有controller层和yml配置

controller层

package com.jt.dubbo.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.jt.dubbo.pojo.User;
import com.jt.dubbo.service.UserService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class UserController {
	
	利用dubbo的方式为接口创建代理对象 利用rpc调用
	
	@Reference(check = false,timeout = 3000)
//	@Reference(loadbalance="leastactive")
	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 "用户入库成功!!!";
	}
}

在这里插入图片描述
在这里插入图片描述

配置

对应zoo1.cfg小点
在这里插入图片描述

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
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
模拟情景一 : 提供者1宕机
在这里插入图片描述
在这里插入图片描述
如下图 还是可以完美实现
在这里插入图片描述
在这里插入图片描述
如上图 归功于zookeeper集群 (注册中心)微服务架构下的

ps:宕机后上线 提供者2就是主机了
在这里插入图片描述

模拟场景2: 如果提供者没宕机 注册中心其中服务器(zookeeper集群)宕机
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
启动出的错 再次刷新没错
在这里插入图片描述
如上述图 依然可以运行

关闭所有集群服务器
在这里插入图片描述
刷新
在这里插入图片描述

还是能实现 结论如下:提供者的记录已被保存 注册中心影响不了运行
在这里插入图片描述
如果将dubbo中的注册中心全部关闭,问用户访问是否受到影响??? 不受影响,因为消费者将服务列表数据保存到本地.

关于Duboo协议的说明

在这里插入图片描述
如上图 没有controller层接收 最底层的通信协议信息 tcp-ip
在这里插入图片描述
在这里插入图片描述
这里的配置文件就等于是把tcp-ip协议封装了 直接调用填写就可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值