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包

<!--增加httpClient 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...
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.3 编辑前端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.4 编辑后端Controller

/**     * http://sso.jt.com/user/testHttpClient     * 返回List<User>     */    @RequestMapping("testHttpClient")    public List<User> testHttpClient(){        return userService.findAll();    }

1.4.5 编辑后端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 什么是微服务

阐明:
1、 为了升高代码的耦合性,将我的项目进行了拆分.依照功能模块拆分为若干个我的项目.该我的项目称之为服务.(分布式思维)
2、如果采纳微服务的构造,要求服务器如果呈现了故障应该实现自动化的故障的迁徙(高可用HA)

4.2 现有服务剖析

阐明:因为nginx负载平衡/反向代理都须要人为的配置,并且呈现了问题不能及时的实现故障的迁徙,所以须要降级为微服务的架构的设计

4.3 微服务架构设计

实现步骤:
1、服务的提供者启动时,将本人的信息注册到注册核心中
2、注册核心承受到了用户的申请之后,更新服务列表信息
3、当消费者启动时,首先会链接注册核心,获取服务列表数据
4、注册核心将本人的服务列表信息同步给客户端(消费者)
5、消费者接管到服务列表数据之后,将信息保留到本人的本地,不便下次调用
6、当消费者接管到用户的申请时,依据本人服务列表的信息进行负载平衡的操作,抉择其中一个服务的提供者,依据IP:PORT进行RPC调用
7、当服务提供者宕机时,注册核心会有心跳检测机制,如果查看宕机,则更新本地的服务列表数据,并且全网播送告诉所有的消费者更新服务列表

4.4 ZK装置参见文档

ZooKeeper下载

网址:
http://zookeeper.apache.org/releases.html
下载Zookeeper地址
http://mirrors.hust.edu.cn/apache/zookeeper/
Zookeeper装置
装置JDK
将JDK1.8文件上传到Linux操作系统中/src/usr/local/java/文件下
解压文件

tar -xvf jdk-8u51-linux-x64.tar.gz

配置环境变量
编辑环境变量配置文件

vim /etc/profile


使JDK失效,之后查看jdk装置是否胜利

source /etc/profile


上传zookeeper安装文件.之后解压
解压文件

tar -xvf zookeeper-3.4.8.tar.gz

批改配置文件
在zk根目录下创立文件夹data/log

mkdir data log

跳入conf目录中批改配置文件
复制配置文件并且批改名称

cp zoo_sample.cfg zoo.cfg


启动zk
跳转到bin目录中 zk启动敞开命令如下

sh zkServer.sh start     或者  ./zkServer.sh start        开启sh zkServer.sh stop                                       进行sh zkServer.sh status                                     查看状态

Zookeeper集群装置
在zookeeper根目录中创立新的文件夹zkCluster

创立zk1/zk2/zk3文件夹

在每个文件夹里创立data/log文件夹

mkdir {zk1,zk2,zk3}/{data,log}


增加myid文件
别离在zk1/zk2/zk3中的data文件夹中创立新的文件myid.其中的内容顺次为1/2/3,与zk节点号对应

编辑myid文件,定义编号

将zoo_sample.cfg 复制为zoo1.cfg之后批改配置文件

批改zoo1.cfg

配置实现后将zoo1.cfg复制2份.之后须要批改对应的文件夹目录.和不同的端口即可
ZK集群测试
通过上面的命令启动zk集群

sh zkServer.sh start   zoo1.cfg                     开启sh zkServer.sh stop    zoo1.cfg                     进行sh zkServer.sh status  zoo1.cfg                     查看状态

查看主从关系,从机状况阐明

查看主从关系,主机状况阐明

对于zookeeper集群阐明
Zookeeper集群中leader负责监控集群状态,follower次要负责客户端链接获取服务列表信息.同时参加投票

4.5 为什么集群个别都是奇数个?

公式:存活的节点>N/2
常识:最小的集群的单位3台
例子

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
问题一:顺次启动时问谁当主机?4当主机
问题二:谁永远不能当主机? 1,2,3

5、Dubbo框架

5.1 Dubbo介绍

官网:http://dubbo.apache.org/
Apache Dubbo |db| 提供了六大外围能力:面向接口代理的高性能RPC调用,智能容错和负载平衡,服务主动注册和发现,高度可扩大能力,运行期流量调度,可视化的服务治理与运维。

调用原理图:

5.2 Dubbo入门案例

5.2.1 批改配置文件内容

1、批改SpringBoot的版本

2、批改模块名称 改为dubbo-jt-demo-interface

5.2.2 导入maven我的项目

5.2.3 测试成果