jt服务器-进阶知识

HttpClient入门

服务器之间的通信必定离不开协议,http协议,所以引出HttpClient。

1.1 HttpClient介绍

HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java net包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient。现在HttpClient最新版本为 HttpClient 4.5 .6(2015-09-11)

1.2 场景介绍

说明:跨域的形式只能发生在有页面的web端,由浏览器解析页面JS.发起ajax请求.实现跨域.但是由于分布式的思想,后端服务器的数量众多.有时可能由A业务服务器向B业务服务器获取业务数据,但是没有页面的支持,所以不能通过跨域的形式实现.只能通过远程过程调用的方式实现数据的通信
在这里插入图片描述

在这里插入图片描述

1.3 HttpClient入门案例

如果能远程访问我们的百度服务器,是不是我们也可以用通用的手段去访问支付宝服务器和我们自己的服务器呢?是的

导入jar包

<!--添加httpClient jar包 -->
		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpclient</artifactId>
		</dependency>

测试案例(万能用法)

package com.jt.test;
import java.io.IOException;
import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.junit.jupiter.api.Test;
public class TestHttpClient {
	
	/**
	 * 案例说明:                           万能用法
	 * 	1.利用httpClient机制 访问百度服务器.   http://www.baidu.com
	 * 
	 * 
	 * 	2.实现步骤: (了解即可)
	 * 		1.定义请求网址
	 * 		2.定义httpClient工具API对象
	 * 		3.定义请求的类型
	 * 		4.发起请求,获取返回值结果
	 * 		5.校验返回值
	 * 		6.获取返回值结果数据
	 */
	@Test
	public void testGet() throws ClientProtocolException, IOException {
		String url = "http://www.baidu.com";//任意网络资源  包裹业务服务器.
		CloseableHttpClient httpClient = HttpClients.createDefault();//定义httpClient工具API对象
		HttpGet httpGet = new HttpGet(url);//定义请求的类型
		CloseableHttpResponse response = httpClient.execute(httpGet);//不能保证网络请求一定正确.
		//发起请求之后 需要判断返回值结果是否正确  一般条件下判断响应状态码信息是否为200.
		//404 400 提交参数异常  406 接收参数异常 500 服务器异常  504  超时   200正常 
		int status = response.getStatusLine().getStatusCode();
		if(status == 200) {
			//说明请求正确  获取返回值的实体对象
			HttpEntity httpEntity = response.getEntity();
			//将远程服务器返回的信息,转化为字符串. 方便调用   1.json   2.html代码片段
			String result = EntityUtils.toString(httpEntity,"utf-8");
			System.out.println(result);
		}
	}
	
}

成功测试结果
在这里插入图片描述

1.4HttpClient与跨域的区别

跨域:服务器A直接通过浏览器(即是html页面)发起了ajax请求,直接由客户端B的Controller来处理请求,最后由客户端B去连接数据库拿数据
在这里插入图片描述

HttpClient(万能用法):HttpClient属于远程过程调用的一种,没有浏览器支持的时候就采取这种模式进行服务器的通信。
在这里插入图片描述

Dubbo框架(属于优化httpClient远程调用的一种技术)

1.1 SOA思想(架构设计思想)

面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和协议联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构件在各种各样的系统中的服务可以以一种统一和通用的方式进行交互。
在这里插入图片描述

1.2 RPC思想

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

“哦!我明白了”,说着,老婆开始收拾包包。
“你这是干啥去哦”
“我?我要出门浪去呀,待会记得接收我的远程调用哦,哦不,咱们要专业点,应该说,待会记得接收我的RPC哦!”

1.3 什么是RPC

RPC是远程过程调用(Remote Procedure Call)的缩写形式。SAP系统RPC调用的原理其实很简单,有一些类似于三层构架的C/S系统,第三方的客户程序通过接口调用SAP内部的标准或自定义函数,获得函数返回的数据进行处理后显示或打印。

总结: 需要调用第三方完成本地的服务

1.4 Dubbo框架介绍

Apache Dubbo |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:
1.面向接口的远程方法调用,
2.智能容错和负载均衡
3.服务自动注册和发现。

1.5 Dubbo框架工作原理图

在这里插入图片描述

组件说明:
1.消费者 负责接收用户的请求信息的. 页面
2.提供者/生产者 主要负责实现业务接口.
3.注册中心–灵魂点 注册中心基于心跳检测机制.可以非常灵活的检查服务是否可用.及服务自动的注册和发现功能.
4.监控 监控整合dubbo框架内部的状态信息.

1.6 注册中心工作原理(重点)

由此图的问题引出新的方案:
在这里插入图片描述

步骤:
1.当服务提供者启动时,将自己的IP地址/端口号/服务数据一起注册到注册中心中.
2.当注册中心接收提供者的数据信息之后,会维护服务列表数据.
3.当消费者启动时,会连接注册中心.
4.获取服务列表数据.之后在本地保存记录.
5.当用户需要业务操作时,消费者会根据服务列表数据,之后找到正确的IP:PORT直接利用RPC机制进行远程访问.
6.注册中心都有心跳检测机制.当发现服务器宕机/或者新增服务时.则会在第一时间更新自己的服务列表数据,并且全网广播通知所有的消费者.

在这里插入图片描述

补充知识:注册中心的选择,如果使用dubbo框架注册中心就选择zookeeper,如果使用springcloud微服务架构注册中心使用Eureka。

1.7 安装注册中心-zookeeper(简称ZK)

ZK下载 --https://zookeeper.apache.org/
在这里插入图片描述
ZK介绍

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
ZooKeeper包含一个简单的原语集,提供Java和C的接口。
ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在$zookeeper_home\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。
总结: ZooKeeper是分布式 应用程序服务的调度器.

导入Dubbo框架的入门案例流程

1.1把入门案例导入工作空间去

在这里插入图片描述

1.2 使用STS导入工作空间已存在的maven项目

在这里插入图片描述

Zookeeper中的集群说明

1.1 为什么集群一般都是奇数个?

公式: 当前剩余节点数量 > N/2 集群可以正常的使用!!!
分析1: 减1的意思代表如果宕机了一台服务器的意思
1台主机能否搭建集群 1-1 > 0.5??? 1台服务器不能搭建集群的
2台服务器 2-1>1??? 2台服务器也不能搭建集群.
3台服务器 3-1>1.5??? 3台服务器是搭建集群的最小单位.
4台服务器 4-1>2 ??? 4台服务器也能搭建集群

分析2: 为什么集群是奇数台,不是偶数台
3台服务器允许宕机的最大的数量是几台? 3个节点最多允许宕机1台服务器.
4台服务器允许宕机的最大的数量是几台? 4个节点最多允许宕机1台服务器.
结论: 搭建偶数台的容灾效果与奇数台相同,所以从成本的角度考虑,搭建奇数台.

1.2 Zookeeper的集群选举原理

问题1:如果是3台zookeeper 将主机宕机之后,集群内部有高可用机制.谁当主机(答案B)
已知2182是主机

A: 2181 B:2183 对

问题2: 如果再次将现有的主机宕机,问谁是主机? C 因为一台主机根本不是集群了,当前剩余的节点数量已经小于 N/2了
A: 2181 B. 剩余其他服务器 C.没有主机!!!(当前集群奔溃)

问题3: 如果依次初始化1-5台服务器 问1.谁是主机? 问2:哪几台服务器不能当主机?

A: 主机是随机的,都可以当主机,看宕机集群是否正常工作.

B: 由启动顺序决定 1-2的服务器不能当主机

C: 第三台当主机.,1-2的服务器不能当主机.(正确)

在这里插入图片描述

集群选举的原理: zk集群选举时由启动顺序决定.一般采用最大值(myid)优先策略. 投票数超过半数当选主机.

第三台启动的时候就已经三票了,即使后面的myid比第三台大都没有用,因为选举已经结束了。如果myid3宕机了,就必定是myid5当主机

Dubbo入门案例

在这里插入图片描述

1.0 程序调用之间的依赖关系(注意此原理)

在这里插入图片描述

1.1 导入jar包

说明:在父级项目中引入dubbo的jar包文件

<dependency>
			<groupId>com.alibaba.boot</groupId>
			<artifactId>dubbo-spring-boot-starter</artifactId>
			<version>0.2.0</version>
		</dependency>

1.2 编辑中立的接口项目interface

1).接口项目创建过程
2).定义service接口
在这里插入图片描述

1.3 定义服务提供者

提供者代码结构
在这里插入图片描述

配置userServiceImpl

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   注意是Alibaba的service不是spring的service
//@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);
	}
}

编辑YML配置文件

#关于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  #每一个服务都有自己特定的端口 不能重复. 官方文档建议往20880端口后写,因为后面几乎没有在用,自己定义的

dubbo通讯原理
在这里插入图片描述

1.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

Dubbo 负载均衡策略

1.1 dubbo负载均衡说明

说明:Dubbo框架对外提供了负载均衡的机制(自带的,不需要我们配置).该机制称之为客户端负载均衡. 消费者在发起请求之前.就已经清除的知道将来访问的服务器是谁。

1.2 负载均衡接口说明

在这里插入图片描述

在这里插入图片描述

1.3 hash一致性算法

说明:消费者访问绑定了指定的提供者

//要求所有的字母全部小写
	@Reference(loadbalance="consistenthash")
	private UserService userService; 

1.4 最小访问量

说明: 挑选当前服务器访问压力最小的服务器进行访问

//要求所有的字母全部小写
@Reference(loadbalance="leastactive")
private UserService userService; 

1.5 随机算法(默认的选项)

说明:该算法是默认的配置.

//要求所有的字母全部小写
	@Reference(loadbalance="random")
	private UserService userService; 

1.6 轮询算法

说明:根据配置依次轮询访问.

	//要求所有的字母全部小写
	@Reference(loadbalance="roundrobin")
	private UserService userService; 

京淘项目改造

1.1 改造说明

JT-WEB 应该充当 消费者
JT-MANAGE 应该充当 提供者
JT-SSO 应该充当 提供者

1.2 添加jar包

	<!--引入dubbo配置 -->
		<dependency>
			<groupId>com.alibaba.boot</groupId>
			<artifactId>dubbo-spring-boot-starter</artifactId>
			<version>0.2.0</version>
		</dependency>

1.3 准备中立接口

说明:在jt-common中,添加中立的接口(其实我们也可以新建一个叫做jt-interface,只不过现在有现成的了,就直接用jt-common就好了)
在这里插入图片描述

1.4 改造JT-SSO 服务提供者(添加DubboUserService实现类)

在这里插入图片描述

1.5 编辑JT-SSO(提供者) YML配置文件

在这里插入图片描述

1.6 改造JT-WEB消费者

说明:在UserController中注入Dubbo接口

@RequestMapping("/user")
@Controller  //因为这里是页面的跳转,必定经过视图解析器
public class UserController {
	//(check = false)  表示消费者启动的时候,不需要检查是否有服务的提供者
	//假设将来我们启动的顺序出了问题,如果提供者不启动,消费者根本不能启动,方便了我们随意的启动服务器
	@Reference(check = false) 
	private DubboUserService dubboUserService;

1.6 改造JT-WEB消费者YML配置

server:
  port: 8092    
spring:     #定义springmvc视图解析器
  mvc:
    view:
      prefix: /WEB-INF/views/
      suffix: .jsp


dubbo:
  scan:
    basePackages: com.jt
  application:
    name: consumer-web   #定义消费者名称
  registry:               #注册中心地址
    address: zookeeper://192.168.126.129:2181?backup=192.168.126.129:2182,192.168.126.129:2183

  

JT用户注册功能实现

1.1 业务需求说明

1).当用户点击注册按钮时,将进行表单数据提交.
2).利用post请求提交 username/password/phone
3).返回值要求: SysResult对象
在这里插入图片描述

1.2 了解页面结构

在这里插入图片描述

在这里插入图片描述

1.3 编辑jt-web(消费者) UserController

	/**
	 * 请求url地址:http://www.jt.com/user/doRegister
	 * 
	 * 参数:用户名/密码/电话号码  User对象
	 * 
	 * 返回值SysResult (经过前端js分析知道返回值是它)
	 */
	
	@RequestMapping("/doRegister")
	public SysResult doRegister(User user){
		
		dubboUserService.doRegister(user);
		return SysResult.success();
	}

1.4 编辑JT-SSO(提供者) DubboUserServiceImpl

public class DubboUserServiceImpl implements DubboUserService {
	
	@Autowired
	private UserMapper userMapper;
	@Transactional	//事务控制
	@Override
	public void doRegister(User user) {
		
		String password = user.getPassword(); //获取明文密码,即是用户在浏览器输入的密码
		password = DigestUtils.md5DigestAsHex(password.getBytes());//讲明文密码进行加密
		
		user.setPassword(password).setEmail(user.getPhone())  //因为没有邮箱先用电话号码顶替
		.setCreated(new Date()).setUpdated(user.getCreated());
		
		
		userMapper.insert(user);
		
	}
}

1.5 关于POJO转化异常

说明:如果dubbo操作过程中,出现了如下的报错,
问题原因: 程序的热部署导致的报错. 导致zk中出现了多条相同的服务信息. 导致负载均衡时不清楚如何挑选.导致报错.
解决方案: 停止服务器,重启即可.

在这里插入图片描述

1.6 注册效果展现(成功)

在这里插入图片描述

1.7 关于Dubbo调用说明(图)

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值