关于java:京淘项目day17

3次阅读

共计 5230 个字符,预计需要花费 14 分钟才能阅读完成。

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;

@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.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 什么是微服务

阐明:

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

5.2.2 导入 maven 我的项目

5.2.3 测试成果

正文完
 0