乐趣区

关于java:JTday17

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;

@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;
    }
}

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 |ˈdʌbəʊ| 提供了六大外围能力:面向接口代理的高性能 RPC 调用,智能容错和负载平衡,服务主动注册和发现,高度可扩大能力,运行期流量调度,可视化的服务治理与运维。

调用原理图:

5.2 Dubbo 入门案例

5.2.1 批改配置文件内容

1、批改 SpringBoot 的版本

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

5.2.2 导入 maven 我的项目

5.2.3 测试成果

退出移动版