├── Consistent-Hash.md
├── LICENSE
├── LinkedHashMap.md
├── Linux-normal.md
├── Linux-normal2.md
├── Markdown小计.md
├── ReentrantLock.md
├── SSM1.md
├── SSM10.md
├── SSM11.md
├── SSM12.md
├── SSM13.md
├── SSM14.md
├── SSM15.md
├── SSM16.md
├── SSM17.md
├── SSM2.md
├── SSM3.md
├── SSM4.md
├── SSM5.md
├── SSM6.md
├── SSM7.md
├── SSM8.md
├── SSM9.md
├── SpringBoot
└── SpringBoot-tips.md
├── Synchronize.md
├── algorithm
├── LRU-cache.md
├── consistent-hash.md
├── time wheel.md
└── timer-detail.md
├── annual-summary
├── 2018.md
├── 2019.md
├── 2020.md
├── 2021.md
├── 2022.md
├── 2023.md
├── 2024.md
├── GoodBye 2016,Welcome 2017 | 码农砌墙记.md
├── img.png
├── img_1.png
└── img_2.png
├── baidu-google.md
├── basic
├── Go-OOP.md
├── parameter-trans.md
└── python-oop.md
├── compilation
└── Lexer.md
├── concurrent
├── ArrayBlockingQueue.md
├── CountDownLatch.md
├── threadpool-01.md
└── threadpool-02.md
├── cs
├── Linux Pipe.md
└── not easy emoji.md
├── desigin-patterns
└── template-method.md
├── distributed-lock
├── distributed-lock-redis-update.md
└── distributed-lock-redis.md
├── distributed
└── distributed-discovery-zk.md
├── elasticsearch
└── ElasticSearch VS MySQL.md
├── exam
└── 2018-06-07-The-university-entrance-exam.md
├── framework-design
├── dynamic-rpc.md
├── grpc.md
├── sharding-db-02.md
├── sharding-db-03.md
└── sharding-db.md
├── gjson
├── gjson01.md
├── gjson02.md
├── xjson03.md
└── xjson04-bitwisee-operation.md
├── go
├── for-mistake.md
├── github-actions.md
├── go channel vs java BlockingQueue.md
├── go-benchmark-test.md
├── go-grpc-client-gui.md
├── go-lib.md
├── go-timeout.md
├── gorm-optimistic.md
├── lru-cache.md
├── observer.md
├── one-hour-write-cli-app.md
├── other-lang-singleton-pattern.md
├── slice pointer.key
└── slice pointer.md
├── gscript
├── gscript01.md
├── gscript02-antlr-statement.md
├── gscript03-scope-func.md
├── gscript04-preview.md
├── gscript05-write-site.md
├── gscript06-operator-overloading.md
├── gscript07-return.md
├── gscript08-write-site-enhance.md
├── gscript10-write-native-lib.md
└── gscript11-closure.md
├── guava
├── guava-bloom-filter.md
├── guava-cache-2.md
└── guava-cache.md
├── https.md
├── istio
└── istio1.12-upgrade-fix.md
├── java-reflect.md
├── java-senior
├── ArrayList VS LinkedList.md
├── ConcurrentHashMap.md
├── JVM-Troubleshoot.md
├── JVM-concurrent-HashSet-problem.md
├── OOM-Disruptor.md
├── ThreadPool.md
├── coding-online-analysis.md
├── concurrent-in-action.md
├── concurrent-in-action2.md
├── design-if-else.md
├── java-memary-allocation.md
└── thread-communication.md
├── java-thread1.md
├── java-thread2.md
├── k8s
├── cloudnative-java.md
└── grafana-variable.md
├── kafka
├── kafka-consumer.md
└── kafka-product.md
├── metrics
└── relabel_configs_ metric_relabel_configs.md
├── netty
├── Netty(1)TCP-Heartbeat.md
├── Netty(2)Thread-model.md
├── Netty(3)TCP-Sticky.md
├── cim01-started.md
├── cim02-v1.0.1.md
├── cim03-heartbeat.md
└── million-sms-push.md
├── newObject.md
├── normal-skill1.md
├── normal-skill2.md
├── normal-skill3.md
├── ob
├── 2024-cloud-native.md
├── Bookkeeper-storage.md
├── Build-ower-AI-robot.md
├── ChatGPT-hole.md
├── Golang-interview-01.md
├── Helm-tips.md
├── Kubernetes-tricks.md
├── OTel-demo.md
├── OTel-member.md
├── OpenTelemetry-01-trace.md
├── OpenTelemetry-02-metrics.md
├── OpenTelemetry-client-log-mdc.md
├── OpenTelemetry-create-instrumentation.md
├── OpenTelemetry-custom-instrument.md
├── OpenTelemetry-enterprise.md
├── OpenTelemetry-getstart.md
├── OpenTelemetry-grpc-principle.md
├── OpenTelemetry-metrics-concept.md
├── OpenTelemetry-trace-concept.md
├── Pulsar Proposal.md
├── Pulsar test framework.md
├── Pulsar-Broker-Interceptor.md
├── Pulsar-Client.md
├── Pulsar-Delete-Topic.md
├── Pulsar-JWT.md
├── Pulsar-SQL.md
├── Pulsar-loadbalance.md
├── Pulsar3.0-new-feature.md
├── Pulsar3.0-upgrade.md
├── StarRocks-MV-refresh-Principle.md
├── StarRocks-build-in-local.md
├── StarRocks-dev-env-build.md
├── StarRocks-dev-shard-data-build.md
├── StarRocks-meta.md
├── VictoriaLogs-Intro.md
├── about-opensource-argument.md
├── cim-2.0.0.md
├── cim-client-sdk.md
├── codereview-practice.md
├── create-a-plugin-for-cprobe.md
├── git-tips-rebase.md
├── go-5-tips.md
├── go-loop-fix.md
├── how-operator-working.md
├── how-to-involve-OpenSource.md
├── how-to-monitoring-nginx.md
├── how-to-write-otel-extensions.md
├── istio-install-problem.md
├── jdk21+springboot+OTel+SPI.md
├── k8s-0-start.md
├── k8s-Ingress.md
├── k8s-Istio01.md
├── k8s-Istio02.md
├── k8s-configmap.md
├── k8s-grpc-lb.md
├── k8s-istio03.md
├── k8s-log-collect.md
├── k8s-monitor-pod.md
├── k8s-probe.md
├── k8s-pulsar-scale.md
├── k8s-question-01.md
├── k8s-restart-pod.md
├── k8s-rollout.md
├── k8s-service.md
├── newsletter
│ ├── Newsletter01-20231013.md
│ ├── Newsletter02-20231022.md
│ ├── Newsletter03-20231027.md
│ ├── Newsletter04-20231103.md
│ ├── Newsletter05-20231110.md
│ ├── Newsletter06-20231117.md
│ ├── Newsletter07-20231124.md
│ ├── Newsletter08-20231201.md
│ ├── Newsletter09-20231208.md
│ ├── Newsletter10-20231215.md
│ ├── Newsletter10-20231222.md
│ ├── Newsletter12-20231229.md
│ ├── Newsletter12-202401012.md
│ ├── Newsletter12-20240105.md
│ └── Newsletter14-20240223.md
├── novice-contribute-open-source.md
├── operator-e2e-test.md
├── otel-replace-sw.md
├── podcasts-english-0-vim.md
├── podcasts-english-1-vim.md
├── pulsar-client-zero-consumer.md
├── pulsar-slow-consume.md
├── translate-pulsar-2023-year-in-review.md
├── translate-pulsar-3.2.0.md
├── unit-test.md
├── ✅开源项目如何做集成测试.md
├── 如何在平淡的工作中整理出有价值的简历.md
├── 如何选择可以搞钱的技术栈.md
├── 推荐一些值得学习的开源项目和框架.md
├── 🎉how-to-be-committer.md
├── 💢线上高延迟请求排查.md
└── 🤳cim-support-integration-test.md
├── open source
└── how to contribute open-source project.md
├── personal
├── 1W-star-update.md
├── 1W-star.md
├── Interview-experience.md
├── find-job-experience.md
└── how-to-be-developer.md
├── pulsar
├── pulsar-interrupted.md
├── pulsar-load-banance.md
├── pulsar-perf-test.md
├── pulsar-repeat-consume.md
└── pulsar-start.md
├── sbc
└── sbc7-Distributed-Limit.md
├── sbc1.md
├── sbc2.md
├── sbc3.md
├── sbc4.md
├── sbc5.md
├── sbc6.md
├── skill
├── 1Kstar.md
├── first-blog.md
└── resume.md
├── spring
└── spring-bean-lifecycle.md
├── ssm
└── SSM18-seconds-kill.md
├── starrocks
└── StarRocks-upgrade.md
├── tools
└── blog-toolbox.md
├── translation
├── hidden-gems-goland.md
├── how-to-use-git-efficiently.md
├── new-developer-friendly-features-after-java-8.md
├── translation-What Is The Best Programming Language to Start.md
└── useful-unknown-java-features.md
├── translation1-12 cool things you can do with GitHub.md
├── troubleshoot
├── SpringCloud-Feign-dynamic-url.md
├── cpu-percent-100-02.md
├── cpu-percent-100.md
├── dubbo-start-slow.md
├── pulsar-repeat-consume.md
├── thread-gone.md
└── thread-gone2.md
├── vlog
├── Basketball Day one.md
├── Chinese-coder-daily.md
├── Chinese-coder-weekends-01.md
└── Chinese-coder-weekends-02.md
├── volatile.md
├── wheel
├── cicada1.md
├── cicada2.md
├── cicada3.md
├── cicada4.md
├── cicada5.md
├── cicada6.md
├── cicada7-exception-handle.md
├── cicada8-spi.md
├── cicada9-proxy.md
├── feign-plus.md
└── feign-plus2.md
└── 第一次总结.md
/Consistent-Hash.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 一致性 Hash 算法分析
3 | date: 2018/01/08 02:01:36
4 | categories:
5 | - 算法
6 | ---
7 |
8 | 
9 |
10 | 当我们在做数据库分库分表或者是分布式缓存时,不可避免的都会遇到一个问题:
11 |
12 | 如何将数据均匀的分散到各个节点中,并且尽量的在加减节点时能使受影响的数据最少。
13 |
14 | ## Hash 取模
15 | 随机放置就不说了,会带来很多问题。通常最容易想到的方案就是 `hash 取模`了。
16 |
17 | 可以将传入的 Key 按照 `index = hash(key) % N` 这样来计算出需要存放的节点。其中 hash 函数是一个将字符串转换为正整数的哈希映射方法,N 就是节点的数量。
18 |
19 | 这样可以满足数据的均匀分配,但是这个算法的容错性和扩展性都较差。
20 |
21 | 比如增加或删除了一个节点时,所有的 Key 都需要重新计算,显然这样成本较高,为此需要一个算法满足分布均匀同时也要有良好的容错性和拓展性。
22 |
23 |
24 |
25 | ## 一致 Hash 算法
26 |
27 | 一致 Hash 算法是将所有的哈希值构成了一个环,其范围在 `0 ~ 2^32-1`。如下图:
28 |
29 | 
30 |
31 | 之后将各个节点散列到这个环上,可以用节点的 IP、hostname 这样的唯一性字段作为 Key 进行 `hash(key)`,散列之后如下:
32 |
33 | 
34 |
35 | 之后需要将数据定位到对应的节点上,使用同样的 `hash 函数` 将 Key 也映射到这个环上。
36 |
37 | 
38 |
39 | 这样按照顺时针方向就可以把 k1 定位到 `N1节点`,k2 定位到 `N3节点`,k3 定位到 `N2节点`。
40 |
41 | ### 容错性
42 | 这时假设 N1 宕机了:
43 |
44 | 
45 |
46 | 依然根据顺时针方向,k2 和 k3 保持不变,只有 k1 被重新映射到了 N3。这样就很好的保证了容错性,当一个节点宕机时只会影响到少少部分的数据。
47 |
48 | ### 拓展性
49 |
50 | 当新增一个节点时:
51 |
52 | 
53 |
54 | 在 N2 和 N3 之间新增了一个节点 N4 ,这时会发现受印象的数据只有 k3,其余数据也是保持不变,所以这样也很好的保证了拓展性。
55 |
56 | ## 虚拟节点
57 | 到目前为止该算法依然也有点问题:
58 |
59 | 当节点较少时会出现数据分布不均匀的情况:
60 |
61 | 
62 |
63 | 这样会导致大部分数据都在 N1 节点,只有少量的数据在 N2 节点。
64 |
65 | 为了解决这个问题,一致哈希算法引入了虚拟节点。将每一个节点都进行多次 hash,生成多个节点放置在环上称为虚拟节点:
66 |
67 | 
68 |
69 | 计算时可以在 IP 后加上编号来生成哈希值。
70 |
71 | 这样只需要在原有的基础上多一步由虚拟节点映射到实际节点的步骤即可让少量节点也能满足均匀性。
72 |
73 | ## 号外
74 | 最近在总结一些 Java 相关的知识点,感兴趣的朋友可以一起维护。
75 |
76 | > 地址: [https://github.com/crossoverJie/Java-Interview](https://github.com/crossoverJie/Java-Interview)
77 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 crossoverJie
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Linux-normal.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Linux(一)常用命令
3 | date: 2016/4/10 21:01:36
4 | categories:
5 | - Linux笔记
6 | tags:
7 | - Linux
8 | ---
9 | # 前言
10 | > 由于现在JAVA开发的很多应用都是部署到Linux系统上的,因此了解和掌握一些Linux的常用命令是非常有必要的,以下就是在Java开发过程中一些常用的命令。
11 |
12 | ----------
13 |
14 | # 常用命令
15 | 1. 查找文件
16 | `find / -name log.txt`
17 | 根据名称查找在 /目录下的 log.txt文件。
18 |
19 | `find .-name "*.xml"`
20 | 递归查找所有的xml文件。
21 |
22 | `find .-name "*.xml"|xargs grep "hello"`
23 | 递归查找所有包含hello的xml文件。
24 |
25 | `ls -l grep 'jar'`
26 | 查找当前目录中的所有jar文件。
27 |
28 | 2. 检查一个文件是否运行
29 | `ps –ef|grep tomecate`
30 | 检查所有有关tomcat的进程。
31 |
32 | 3. 终止线程
33 | `kill -9 19979 `
34 | 终止线程号为19979的线程
35 |
36 | 4. 查看文件,包括隐藏文件。
37 | `ls -al`
38 |
39 | 5. 查看当前工作目录。
40 | `pwd`
41 |
42 | 6. 复制文件包括其子文件到指定目录
43 | `cp -r source target`
44 | 复制source文件到target目录中。
45 |
46 | 7. 创建一个目录
47 | `mkdir new`
48 | 创建一个new的目录
49 |
50 | 8. 删除目录(前提是此目录是空目录)
51 | `rmdir source`
52 | 删除source目录。
53 |
54 | 9. 删除文件 包括其子文件
55 | `rm -rf file`
56 | 删除file文件和其中的子文件。
57 | `-r`表示向下递归,不管有多少目录一律删除
58 | `-f`表示强制删除,不做任何提示。
59 |
60 | 10. 移动文件
61 | `mv /temp/movefile /target`
62 |
63 | 11. 切换用户
64 | `su -username`
65 |
66 | 12. 查看ip
67 | `ifconfig`
68 | 注意是 `ifconfig` 不是windows中的`ipconfig`
69 |
70 | # 总结
71 | 以上就是在Linux下开发Java应用常用的Linux命令,如有遗漏请在评论处补充,我将不定期添加。
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
--------------------------------------------------------------------------------
/Markdown小计.md:
--------------------------------------------------------------------------------
1 | title: Markdown小计 #可以改成中文的,如“新文章”
2 | date: 2016-05-06 16:04:09 #发表日期,一般不改动
3 | categories:
4 | - blog #文章文类
5 | tags:
6 | - Markdown #文章标签,多于一项时用这种格式,只有一项时使用tags: blog
7 | ---
8 |
9 | `# 标题`
10 | # 表示标题 一个#号代表一级标题,以此类推。
11 |
12 | `* 无序列表`
13 |
14 | * 无序列表
15 |
16 | `> 引用`
17 |
18 | > 引用
19 |
20 | `[http://www.baidu.com](http://www.baidu.com "百度")`
21 |
22 | [百度](http://www.baidu.com "百度")
23 |
24 |
25 | `插入图片`
26 |
27 | 
28 |
--------------------------------------------------------------------------------
/SSM10.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: SSM(十) 项目重构-互联网项目的Maven结构
3 | date: 2017/03/04 01:44:54
4 | categories:
5 | - SSM
6 | tags:
7 | - Maven
8 | - 重构
9 | ---
10 | 
11 |
12 | # 前言
13 |
14 | 很久没有更新博客了,之前定下周更逐渐成了月更。怎么感觉像我追过的一部动漫。
15 | 这个博文其实很早就想写了。
16 | 之前所有的代码都是在一个模块里面进行开发,这和maven的理念是完全不相符的,最近硬是抽了一个时间来对项目的结构进行了一次重构。
17 |
18 | > 先来看看这次重构之后的目录结构
19 |
20 | 
21 |
22 |
23 |
24 | # 为什么需要分模块
25 | > 至于为什么要分模块呢?
26 |
27 | 我们设想一个这样的场景:
28 | 在现在的互联网开发中,会把一个很大的系统拆分成各个子系统用于降低他们之间的耦合度。
29 |
30 | 在一个子项目中通常都会为`API`、`WEB`、`Service`等模块。
31 | 而且当项目够大时,这些通常都不是一个人能完成的工作,需要一个团队来各司其职。
32 |
33 | 想象一下:当之前所有的项目都在一个模块的时候,A改动了API,需要`Deploy`代码。而B也改动了`service`的代码,但并没有完全做完。所以A在提交`build`的时候就会报错
34 |
35 | 而且在整个项目足够大的时候,这个`build`的时间也是很影响效率的。
36 |
37 | 但让我将各个模块之间分开之后效果就不一样了。我修改了`API`我就只需要管我的就行,不需要整个项目进行`build`。
38 |
39 | 而且当有其他项目需要依赖我这个`API`的时候也只需要依赖`API`即可,不用整个项目都依赖过去。
40 |
41 |
42 | # 各个模块的作用
43 |
44 | 来看下这次我所分的模块。
45 |
46 | ## ROOT
47 | 这是整个项目的根节点。
48 | 先看一下其中的`pom.xml`:
49 |
50 | ```xml
51 | com.crossoverJie
52 | SSM
53 | pom
54 | 2.0.0
55 |
56 |
57 | SSM-API
58 | SSM-BOOT
59 | SSM-SERVICE
60 | SSM-WEB
61 |
62 |
63 |
64 | UTF-8
65 | 4.1.4.RELEASE
66 | 2.5.0
67 | 6.0.1
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 | com.crossoverJie
76 | SSM-API
77 | 2.0.0
78 |
79 |
80 |
81 | ```
82 |
83 | 我截取了其中比较重点的配置。
84 |
85 | 由于这是父节点,所以我的`packag`类型使用的是`pom`。
86 | 其中分别有着四个子模块。
87 |
88 | 其中重点看下``这个标签。
89 | 如果使用的是`IDEA`这个开发工具的话是可以看到如下图:
90 | 
91 |
92 | 标红的有一个向下的箭头,点一下就可以进入子模块中相同的依赖。
93 | 这样子模块就不需要配置具体的版本了,统一由父模块来进行维护,对之后的版本升级也带来了好处。
94 |
95 | ## SSM-API
96 | 接下来看下`API`这个模块:
97 |
98 | 通常这个模块都是用于定义外部接口的,以及改接口所依赖的一些`DTO类`。
99 | 一般这个模块都是拿来给其他项目进行依赖,并和本项目进行数据交互的。
100 |
101 | ## SSM-BOOT
102 | `BOOT`这个模块比较特殊。
103 | 可以看到这里没有任何代码,只有一个`rpc`的配置文件。
104 | 通常这个模块是用于给我们内部项目进行依赖的,并不像上面的`API`模块一样给其他部门或者是项目进行依赖的。
105 |
106 | 因为在我们的`RPC`调用的时候,用`dubbo`来举例,是需要配置所依赖的`consumer`。
107 |
108 | 但如果是我们自己内部调用的话我们就可以把需要调用自己的`dubbo`服务提供者配置在这里,这样的话我们自己调用就只需要依赖这个`BOOT`就可以进行调用了。
109 |
110 | 哦对了,`BOOT`同时还会依赖`API`,这样才实现了只依赖`BOOT`就可以调用自己内部的`dubbo`服务了。
111 | 如下所示:
112 | ```xml
113 |
114 |
115 | junit
116 | junit
117 | test
118 |
119 |
120 |
121 | com.crossoverJie
122 | SSM-API
123 |
124 |
125 |
126 | ```
127 |
128 | ## SSM-SERVICE
129 | `SERVICE`模块就比较好理解了。
130 | 是处理具体业务逻辑的地方,也是对之前的API的实现。
131 |
132 | 通常这也是一个`web`模块,所以我的`pom`类型是`WAR`。
133 |
134 | ## SSM-WEB
135 | 其实`WEB`模块和`SERVICE`模块有点重合了。通常来说这个模块一般在一个对外提供`http`访问接口的项目中。
136 |
137 | 这里只是为了展示项目结构,所以也写在了这里。
138 |
139 | 他的作用和`service`差不多,都是`WAR`的类型。
140 |
141 | # 总结
142 | 这次没有实现什么特别的功能,只是对一些还没有接触过这种项目结构开发的童鞋能起到一些引导作用。
143 |
144 | 具体源码还请关注我的`github`。
145 |
146 | > 项目地址:[https://github.com/crossoverJie/SSM.git](https://github.com/crossoverJie/SSM.git)
147 |
148 | > 个人博客地址:[http://crossoverjie.top](http://crossoverjie.top)。
149 |
150 | > GitHub地址:[https://github.com/crossoverJie](https://github.com/crossoverJie)。
151 |
152 |
153 |
--------------------------------------------------------------------------------
/SSM6.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: SSM(六)跨域传输
3 | date: 2016/10/18 13:44:54
4 | categories:
5 | - SSM
6 | tags:
7 | - Java
8 | - JSONP
9 | - JSON
10 | ---
11 | 
12 |
13 | # 前言
14 | 不知大家在平时的开发过程中有没有遇到过跨域访问资源的问题,我不巧在上周就碰到一个这样的问题,幸运的是在公司前端同学的帮忙下解决了该问题。
15 |
16 | ## 什么是跨域问题?
17 | 1. 只要协议、域名、端口有任何一个不同,都被当作是不同的域
18 | 2. 只要是在不同域中是无法进行通信的。
19 |
20 |
21 |
22 | 基于以上的的出发点,我们又有跨域共享资源的需求(`譬如现在流行的前后端分离之后分别部署的情况`),本文所采用的解决办法是`JSONP`,说到`JSONP`就会首先想到`JSON`。虽然只有一字之差但意义却完全不一样,首先科普一下`JSON`。
23 |
24 |
25 | # JSON
26 | > 其实现在`JSON`已经是相当流行了,只要涉及到前后端的数据交互大都都是采用的JSON(不管是web还是android和IOS),所以我这里就举一个例子,就算是没有用过的同学也能很快明白其中的意思。
27 |
28 | ## PostMan
29 | 首先给大家安利一款后端开发的利器`PostMan`,可以用于模拟几乎所有的`HTTP`请求,在开发阶段调试后端接口非常有用。
30 | 这是一个Chrome插件,可以直接在google商店搜索直接下载(当然前提你懂得)。
31 | 之后界面就如下:
32 |
33 | 
34 |
35 | 界面非常简洁,有点开发经验的童鞋应该都会使用,不太会用的直接google下就可以了比较简单。
36 | 接着我们就可以利用`PostMan`来发起一次请求获取`JSON`了。这里以我`SSM`项目为例,也正好有暴露一个JSON的接口。地址如下:
37 | [http://www.crossoverjie.top/SSM/content_load](http://www.crossoverjie.top/SSM/content_load)。
38 | 直接在`POSTMAN`中的地址栏输入该地址,采用`GET`的方式请求,之后所返回的就是JSON格式的字符串。
39 | 由于`Javascript`原生的就支持JSON,所以解析起来非常方便。
40 |
41 | # JSONP
42 | 好了,终于可以谈谈`JSONP`了。之前说道`JSONP`是用来解决跨域问题的,那么他是如何解决的呢。
43 | 经过我们开发界的前辈们发现,HTML中拥有`SRC`属性的标签都不受跨域的影响,比如:`
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |