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)前端
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </dependency>
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); } } }
用户经过http://www.jt.com/user/testHt... 请求,获取UserList集合信息.而且将其中的邮箱信息改成电话号码.
JT-WEB服务器 访问JT-SSO时的请求为 http://sso/jt.com/user/testHt...java
@RequestMapping("/testHttpClient") @ResponseBody public List<User> testHttpClient(){ return userService.testHttpClient(); }
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; @Service public 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; } }
/** * http://sso.jt.com/user/testHttpClient * 返回List<User> */ @RequestMapping("testHttpClient") public List<User> testHttpClient(){ return userService.findAll(); }
@Override public List<User> findAll() { return userMapper.selectList(null); }
面向服务的架构(SOA)是一个组件模型,它将应用程序的不一样功能单元(称为服务)进行拆分,并经过这些服务之间定义良好的接口和协议联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操做系统和编程语言。这使得构建在各类各样的系统中的服务能够以一种统一和通用的方式进行交互。nginx
RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另外一个节点提供的服务
本地过程调用:若是须要将本地student对象的age+1,能够实现一个addAge()方法,将student对象传入,对年龄进行更新以后返回便可,本地方法调用的函数体经过函数指针来指定。
远程过程调用:addAge方法在其余的服务器中,若是须要调用则必须经过远程的方式通知其余服务器帮我完成业务调用.web
总结: 利用第三方的服务器,帮我完成业务调用的过程.
理解: 分布式环境中 业务调用几乎都是RPC的.算法
说明:spring
说明:因为nginx负载均衡/反向代理都须要人为的配置,而且出现了问题不能及时的实现故障的迁移,因此须要升级为微服务的架构的设计.apache
实现步骤:
1.服务提供者启动时,将本身的信息注册到注册中心中.
2.注册中心接受到了用户的请求以后,更新服务器列表信息.
3.当消费者启动时,首先会链接注册中心,获取服务列表数据.
4.注册中心将本身的服务列表信息同步给客户端(消费者).
5.消费者接收到服务列表数据以后,将信息保存到本身的本地.方便下次调用.
6.当消费者接收到用户的请求时,根据本身服务列表的信息进行负载均衡的操做,选择其中一个服务的提供者,根据IP:PORT 进行RPC调用.
7.当服务提供者宕机时,注册中心会有心跳检测机制,若是检查宕机,则更新本地的服务列表数据,而且全网广播通知全部的编程
公式: 存活的节点>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台,不然集群崩溃.
搭建奇数台和偶数台其实均可以,可是从容灾性的角度考虑,发现奇数和偶数的效果相同,因此搭建奇数台.api
说明:zk集群选举采用最大值(myid)优先的算法实现,若是集群中没有主机,则开始选举(超半数便可),若是有主机,则选举结束.
考题: 1 2 3 4 5 6 7 依次启动时
问题1:谁当主机? 4当主机
问题2:谁永远不能当选主机? 1,2,3
提供了六大核心能力:面向接口代理的高性能RPC调用,智能容错和负载均衡,服务自动注册和发现,高度可扩展能力,运行期流量调度,可视化的服务治理与运维。
调用原理图:
1).修改SpringBoot的版本
2).修改模块名称 改成dubbo-jt-demo-interface