一、SpringCloud基本概念

  • 1.为什么要使用SpringCloud

    • SpringCloud并不是rpc远程调用框架,而是一套全家桶的微服务解决框架,理念就是解决我们在微服务架构中遇到的任何问题。例如:服务注册中心、分布式配置、服务保护等。
    • SpringCloud 属于微服务全家桶框架 解决我们在
      微服务架构中遇到难题。
  • 2.微服务架构中常见问题
    • 分布式服务注册中心(服务治理) Eureka、Zookeeper、Consule、Nacos、Redis、数据库等;
    • 分布式配置中心 SpringCloud Config、携程阿波罗、Nacos Config;
    • 分布式事务解决方案(MQ最终一致性/LCN(已经淘汰)/ Seata(阿里背书))
    • 分布式任务调度平台(xxl-job、elastic job、阿里巴巴Scheduler)
    • 分布式日志采集系统ELK+Kafka
    • 分布式服务追踪与调用链Zipkin、skywalking等。
    • 分布式锁(Redis(Redisson)/Zookeeper(Curator)实现分布式锁)
    • 服务的接口保护(hystrix/sentinel)
  • 3.SpringCloud第一代和第二代区别
    • SpringCloud第一代:

      • SpringCloud Config 分布式配置中心
      • SpringCloud Netflix 核心组件
      • Eureka:服务治理
      • Hystrix:服务保护框架
      • Ribbon:客户端负载均衡器
      • Feign:基于ribbon和hystrix的声明式服务调用组件
      • Zuul: 网关组件,提供智能路由、访问过滤等功能
    • SpringCloud第二代
      • Spring Cloud Gateway 网关
      • Spring Cloud Loadbalancer 客户端负载均衡器
      • Spring Cloud r4j(Resilience4J) 服务保护
      • Spring Cloud Alibaba Nacos 服务注册
      • Spring Cloud Alibaba Nacos 分布式配置中心
      • Spring Cloud Alibaba Sentinel服务保护
      • SpringCloud Alibaba Seata分布式事务解决框架
      • Alibaba Cloud OSS 阿里云存储
      • Alibaba Cloud SchedulerX 分布式任务调度平台
      • Alibaba Cloud SMS 分布式短信系统
  • 4.为什么Alibaba要推出SpringCloud组件
    • SpringCloud与alibaba相结合,技术上有人负责更新新的组件,也还可以继续使用Spring社区的技术

二、微服务服务注册中心

  • 1.微服务服务注册中心概念

    • 服务治理
    • RPC远程调用
  • 2.什么是远程调用
    • 例如我们平台需要获取到天气预报,就可以直接调用中国天气预报接口:http://wthrcdn.etouch.cn/weather_mini?city=武汉,返回的是json格式数据,可以使用https://www.sojson.com/在线json格式化查看
{"data":{"yesterday":{"date":"26日星期六","high":"高温 15℃","fx":"北风","low":"低温 10℃","fl":"<![CDATA[2级]]>","type":"阴"},"city":"武汉","forecast":[{"date":"27日星期天","high":"高温 19℃","fengli":"<![CDATA[2级]]>","low":"低温 7℃","fengxiang":"北风","type":"阴"},{"date":"28日星期一","high":"高温 21℃","fengli":"<![CDATA[3级]]>","low":"低温 7℃","fengxiang":"东南风","type":"晴"},{"date":"29日星期二","high":"高温 24℃","fengli":"<![CDATA[3级]]>","low":"低温 10℃","fengxiang":"东南风","type":"多云"},{"date":"30日星期三","high":"高温 24℃","fengli":"<![CDATA[2级]]>","low":"低温 12℃","fengxiang":"东风","type":"中雨"},{"date":"31日星期四","high":"高温 18℃","fengli":"<![CDATA[4级]]>","low":"低温 14℃","fengxiang":"北风","type":"小雨"}],"ganmao":"感冒易发期,外出请适当调整衣物,注意补充水分。","wendu":"16"},"status":1000,"desc":"OK"}
  • 3.什么是RPC

    • 远程调用采用接口:接口协议+IP+端口/接口名称?接口参数

      • 接口协议

        • 1.netty 基于netty RPC自定义协议 dubbo
        • 2.http协议接口 httpclient或者okhttp
        • 3.WebService 底层soap+http+xml
      • 微服务架构:http+json格式,json格式比xml格式更加轻量级
      • http传递参数
        • 如果只有一个参数 可以直接使用?传递参数
        • 如果是多个参数 json格式

三、使用HttpClient实现RPC远程调用

1.maven依赖

        <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.5</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.66</version></dependency>

2.工具类HttpClientUtils

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;public class HttpClientUtils {private static final CloseableHttpClient httpClient;public static final String CHARSET = "UTF-8";private static final Log log = LogFactory.getLog(HttpClientUtils.class);// 采用静态代码块,初始化超时时间配置,再根据配置生成默认httpClient对象static {RequestConfig config = RequestConfig.custom().setConnectTimeout(60000).setSocketTimeout(15000).build();httpClient = HttpClientBuilder.create().setDefaultRequestConfig(config).build();}public static String doGet(String url, Map<String, String> params) {return doGet(url, params, CHARSET);}public static String doPost(String url, Map<String, String> params) throws IOException {return doPost(url, params, CHARSET);}/*** HTTP Get 获取内容** @param url     请求的url地址 ?之前的地址* @param params  请求的参数* @param charset 编码格式* @return 页面内容*/public static String doGet(String url, Map<String, String> params, String charset) {try {if (params != null && !params.isEmpty()) {List<NameValuePair> pairs = new ArrayList<NameValuePair>(params.size());for (Map.Entry<String, String> entry : params.entrySet()) {String value = entry.getValue();if (value != null) {pairs.add(new BasicNameValuePair(entry.getKey(), value));}}// 将请求参数和url进行拼接url += "?" + EntityUtils.toString(new UrlEncodedFormEntity(pairs, charset));}HttpGet httpGet = new HttpGet(url);CloseableHttpResponse response = httpClient.execute(httpGet);int statusCode = response.getStatusLine().getStatusCode();if (statusCode != 200) {httpGet.abort();throw new RuntimeException("HttpClient,error status code :" + statusCode);}HttpEntity entity = response.getEntity();String result = null;if (entity != null) {result = EntityUtils.toString(entity, "utf-8");}EntityUtils.consume(entity);response.close();return result;} catch (Exception e) {log.error("请求服务器端出错:" + e);return null;}}/*** HTTP Post 获取内容** @param url     请求的url地址 ?之前的地址* @param params  请求的参数* @param charset 编码格式* @return 页面内容* @throws IOException*/public static String doPost(String url, Map<String, String> params, String charset)throws IOException {List<NameValuePair> pairs = null;if (params != null && !params.isEmpty()) {pairs = new ArrayList<NameValuePair>(params.size());for (Map.Entry<String, String> entry : params.entrySet()) {String value = entry.getValue();if (value != null) {pairs.add(new BasicNameValuePair(entry.getKey(), value));}}}HttpPost httpPost = new HttpPost(url);if (pairs != null && pairs.size() > 0) {httpPost.setEntity(new UrlEncodedFormEntity(pairs, CHARSET));}CloseableHttpResponse response = null;try {response = httpClient.execute(httpPost);int statusCode = response.getStatusLine().getStatusCode();if (statusCode != 200) {httpPost.abort();throw new RuntimeException("HttpClient,error status code :" + statusCode);}HttpEntity entity = response.getEntity();String result = null;if (entity != null) {result = EntityUtils.toString(entity, "utf-8");}EntityUtils.consume(entity);return result;} catch (ParseException e) {log.error("请求服务器端出错:" + e);return null;} finally {if (response != null)response.close();}}
}

3.RpcController

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.sjyl.utils.HttpClientUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;@RestController
public class RpcController {@RequestMapping("/getWeather")public Object getWeather(String city) {String url = "http://wthrcdn.etouch.cn/weather_mini";HashMap<String, String> params = new HashMap<String, String>();params.put("city", city);String result = HttpClientUtils.doGet(url, params);JSONObject json = JSONObject.parseObject(result);Integer status = json.getInteger("status");if (status != 1000) {return "查询天气失败,请稍后重试!";}// 取出今日天气JSONArray forecast = json.getJSONObject("data").getJSONArray("forecast");return forecast;}
}

4.测试

  • 测试地址

    • http://127.0.0.1:8088/sjyl/getWeather?city=福州

一、SpringCloud入门相关推荐

  1. springcloud 入门 10 (eureka高可用)

    eureka高可用: 说白了,就是加一个实例作为原实例的备份,然后一起对外提供服务.这样可以保证在一台机器宕机的时候,整个系统不会死掉.保证其继续对外服务. eureka的集群化: 服务注册中心Eur ...

  2. SpringCloud入门之应用程序上下文服务(Spring Cloud Context)详解

    构建分布式系统非常复杂且容易出错.Spring Cloud为最常见的分布式系统模式提供了简单易用的编程模型,帮助开发人员构建弹性,可靠和协调的应用程序.Spring Cloud构建于Spring Bo ...

  3. SpringCloud入门 —— SSO 单点登录

    前言 本文适合初学者,如有不足或错误之处,还请大家在下方留言指正.(文章稍长,建议点赞收藏) 一.SSO单点登录是什么? 单点登录简介 单点登录SSO (Single Sign On) 是指在一个多系 ...

  4. 1、SpringCloud入门篇,综合概述

    SpringCloud 微服务概述 什么是微服务 目前的微服务并没有一个统一的标准,一般是以业务来划分 将传统的一站式应用,拆分成一个个的服务,彻底去耦合,一个微服务就是单功能业务,只做一件事. 与微 ...

  5. SpringCloud入门-狂神说

    工具:idea Spring官网:https://spring.io/ 详细了解博客连接:https://blog.csdn.net/weixin_43591980/article/details/1 ...

  6. SpringCloud学习一(回顾之前学的微服务知识点、springcloud入门概述、服务提供者和消费者)

    一.回顾之前,如何学习springcloud 回顾之前的知识? JavaSE 数据库 前端 Servlet Http Mybatis Spring SpringMVC SpringBoot Dubbo ...

  7. SpringCloud入门 - 分布式事务【概念、常见框架选择 - tx-lcn】

    分布式事务简介: 事务: 指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行. 本地事务:  SqlSessionfactory   --> 一个数据库范围类事务管理. 分 ...

  8. SpringCloud 入门教程(五): Ribbon实现客户端的负载均衡

    接上节,假如我们的Hello world服务的访问量剧增,用一个服务已经无法承载, 我们可以把Hello World服务做成一个集群. 很简单,我们只需要复制Hello world服务,同时将原来的端 ...

  9. SpringCloud入门实例

    SpringCloud微服务 概述 ​ Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总线 ...

  10. Day2:SpringCloud入门学习——传智播客学习笔记【微服务电商】

    SpringCloud 0.学习目标 ·了解系统架构的演变 ·了解RPC与Http的区别 ·掌握HttpClient的简单使用 ·知道什么是SpringCloud ·独立搭建Eureka注册中心 ·独 ...

最新文章

  1. 逻辑结构图向关系转换规则3
  2. (十)Java B2B2C o2o多用户商城 springcloud架构- SSO单点登录之OAuth2.0登录认证(1)
  3. zz bond配置网络: 两个网卡一个ip
  4. lua的string.gsub初使用
  5. 【转】FPGA到底是啥?
  6. 测试培训大纲第一课时,软件测试基础(培训待续中....)
  7. java开发项目心得体会
  8. 为 Windows 系统替换优雅的苹果字体
  9. Java数据库课程设计-招聘人才管理系统
  10. 高德地图标识大全_连地震都查得一清二楚!高德地图新功能体验
  11. 下载安装cygwin/X
  12. PAT_乙级_1008_筱筱
  13. Hbase(3):HBase常用shell
  14. Python3网络爬虫
  15. 史上最全面的苏州工业园区虚拟住房补贴申请攻略
  16. 史上最全 2019 ICRA顶会四足机器人文献整理
  17. python统计小说人物出现次数_使用python统计《三国演义》小说里人物出现次数前十名,并实现可视化。...
  18. spire.office,Spire.Office 5.3.7组件的最新版本
  19. 隆重推荐Gloo:旨在成为您房间装饰亮点的时尚无线充电站
  20. Visual Code Python Snippet 自定义代码片段及套用模板

热门文章

  1. SQL注入攻击讲解及PHP防止SQL注入攻击的几种方法
  2. 【CISSP备考笔记】第7章:安全运营
  3. logit模型应用实例_广义线性模型应用举例之beta回归及R计算
  4. 组播IP与组播Mac的对应关系
  5. OpenFlow学习笔记(一)——OpenFlow概要和OpenFlow1.0
  6. 简单计算器(Java实训)
  7. python sklearn的训练集测试集根据标签的比例来切分数据集
  8. Cubase Pro 10.5.0 PC 音乐制作宿主软件便携版下载
  9. 使用Vue开发微信小程序1
  10. 开源风控系统radar部署