1. HttpClient
1.1 业务需要阐明
1.2 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.3 HttpClient入门案例
1.3.1 导入jar包
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId></dependency>
1.3.2 HttpClient入门案例
package com.jt.test;import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;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;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import java.io.IOException;//@SpringBootTest //从spring容器中获取bean对象,之后实现测试业务.public class TestHttpClient { /** * 1.实例化HttpClient对象 * 2.定义近程拜访的url地址 * 3.定义申请类型的对象 * 4.发动http申请,获取响应的后果 * 5.对返回值后果进行校验.获取实在的数据信息. * */ @Test public void testGet() throws IOException { HttpClient httpClient = HttpClients.createDefault(); String url = "http://www.baidu.com"; HttpGet httpGet = new HttpGet(url); HttpResponse httpResponse = httpClient.execute(httpGet); //常见后果状态 200 404 406参数异样 500后端服务器异样 504超时 502拜访的网址不存在 //获取状态码 int status = httpResponse.getStatusLine().getStatusCode(); if(status == 200){ //获取响应后果 HttpEntity entity = httpResponse.getEntity(); String result = EntityUtils.toString(entity,"UTF-8"); System.out.println(result); } }}
1.4 HttpClient实现业务逻辑
1.4.1 业务需要
用户通过http://www.jt.com/user/testHt... 申请,获取UserList汇合信息.并且将其中的邮箱信息改为电话号码.
JT-WEB服务器 拜访JT-SSO时的申请为 http://sso/jt.com/user/testHt...
1.4.2 编辑前端Controller
@RequestMapping("/testHttpClient") @ResponseBody public List<User> testHttpClient(){ return userService.testHttpClient(); }
1.4.4 编辑前端Service
package com.jt.service;import com.jt.pojo.User;import com.jt.util.ObjectMapperUtil;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.HttpClients;import org.apache.http.util.EntityUtils;import org.springframework.stereotype.Service;import java.io.IOException;import java.util.ArrayList;import java.util.Date;import java.util.LinkedHashMap;import java.util.List;@Servicepublic class UserServiceImpl implements UserService{ @Override public List<User> testHttpClient() { List userList = new ArrayList<>(); //由jt-web服务器去链接jt-sso的服务器 String url = "http://sso.jt.com/user/testHttpClient"; HttpClient httpClient = HttpClients.createDefault(); HttpGet httpGet = new HttpGet(url); try { HttpResponse httpResponse =httpClient.execute(httpGet); if(httpResponse.getStatusLine().getStatusCode() == 200){ HttpEntity httpEntity = httpResponse.getEntity(); String result = EntityUtils.toString(httpEntity, "UTF-8"); userList = ObjectMapperUtil.toObject(result, userList.getClass()); /* for (LinkedHashMap<String,Object> map : userList){ User userTemp = new User(); userTemp.setId( Long.parseLong(map.get("id")+"")); userTemp.setUsername((String)map.get("username")); userTemp.setPassword((String)map.get("password")); userTemp.setPhone((String)map.get("phone")); userTemp.setEmail((String)map.get("phone")); userList2.add(userTemp); }*/ } } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } return userList; }}
1.4.3 编辑后端Controller
/** * http://sso.jt.com/user/testHttpClient * 返回List<User> */ @RequestMapping("testHttpClient") public List<User> testHttpClient(){ return userService.findAll(); }
1.4.4 编辑后端Service
@Override public List<User> findAll() { return userMapper.selectList(null); }
2. SOA思维
2.1 SOA思维介绍
面向服务的架构(SOA)是一个组件模型,它将应用程序的不同性能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和协定分割起来。接口是采纳中立的形式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种各样的零碎中的服务能够以一种对立和通用的形式进行交互。
3. RPC介绍(调用模式的统称)
3.1 RPC介绍
RPC(Remote Procedure Call)近程过程调用,简略的了解是一个节点申请另一个节点提供的服务
本地过程调用:如果须要将本地student对象的age+1,能够实现一个addAge()办法,将student对象传入,对年龄进行更新之后返回即可,本地办法调用的函数体通过函数指针来指定。
近程过程调用:addAge办法在其余的服务器中,如果须要调用则必须通过近程的形式告诉其余服务器帮我实现业务调用.
总结: 利用第三方的服务器,帮我实现业务调用的过程.
了解: 分布式环境中 业务调用简直都是RPC的.
4. 微服务
4.1 什么是微服务
阐明:
- 为了升高代码的耦合性,将我的项目进行了拆分.依照功能模块拆分为若干个我的项目.该我的项目称之为服务.(分布式思维).
- 如果采纳微服务的构造,要求服务器如果呈现了故障应该实现自动化的故障的迁徙(高可用HA)
4.2 现有服务剖析
阐明:因为nginx负载平衡/反向代理都须要人为的配置,并且呈现了问题不能及时的实现故障的迁徙,所以须要降级为微服务的架构的设计.
4.3 微服务架构设计
实现步骤:
1.服务提供者启动时,将本人的信息注册到注册核心中.
2.注册核心承受到了用户的申请之后,更新服务器列表信息.
3.当消费者启动时,首先会连贯注册核心,获取服务列表数据.
4.注册核心将本人的服务列表信息同步给客户端(消费者).
5.消费者接管到服务列表数据之后,将信息保留到本人的本地.不便下次调用.
6.当消费者接管到用户的申请时,依据本人服务列表的信息进行负载平衡的操作,抉择其中一个服务的提供者,依据IP:PORT 进行RPC调用.
7.当服务提供者宕机时,注册核心会有心跳检测机制,如果查看宕机,则更新本地的服务列表数据,并且全网播送告诉所有的
4.4 ZK装置参见文档
4.5 为什么集群个别都是奇数个?
公式: 存活的节点>N/2
例子:
1个节点是否搭建集群? 1-1 > 1/2 假的 1个节点不能搭建集群2各节点是否搭建集群? 2-1 > 2/2 假的 2个节点不能搭建集群3个节点是否搭建集群? 3-1 > 3/2 真的 3个节点能搭建集群4个节点是否搭建集群? 4-1 > 4/2 真的 4个节点能搭建集群3个节点最多容许宕机1台,否则集群解体.4个节点最多容许宕机1台,否则集群解体.
搭建奇数台和偶数台其实都能够,然而从容灾性的角度思考,发现奇数和偶数的成果雷同,所以搭建奇数台.
4.6 ZK集群选举规定
阐明:zk集群选举采纳最大值(myid)优先的算法实现,如果集群中没有主机,则开始选举(超半数即可),如果有主机,则选举完结.
考题: 1 2 3 4 5 6 7 顺次启动时
问题1:谁当主机? 4当主机
问题2:谁永远不能入选主机? 1,2,3
5. Dubbo框架
5.1 Dubbo介绍
提供了六大外围能力:面向接口代理的高性能RPC调用,智能容错和负载平衡,服务主动注册和发现,高度可扩大能力,运行期流量调度,可视化的服务治理与运维。
调用原理图:
5.2 Dubbo入门案例
批改配置文件内容
1).批改SpringBoot的版本
2).批改模块名称 改为dubbo-jt-demo-interface