Browsed by
分类:zeoly日记

nginx location proxy关于斜杠配置转发代理的例子

nginx location proxy关于斜杠配置转发代理的例子

在nginx配置时,根据uri配置location进行不同的路由转发代理等,这种场景较多,对于正则匹配等方面不在这里复述了,主要关注斜杠配置的几个例子。 例如进入的请求uri为/foo/api 在代理转发的例如upsteam后无uri的情况 location proxy_pass 转换后结果 /foo/ http://upstream/ /api /foo http://upstream/ //api /foo/ http://upstream /foo/api /foo http://upstream /foo/api 在代理转发的例如upsteam后变更uri的情况 此情况下无论如何都无法保留location本身匹配的部分,即foo location proxy_pass 转换后结果 /foo/ http://upstream/bar/ /bar/api /foo http://upstream/bar/ /bar//api /foo/ http://upstream/bar /barapi /foo http://upstream/bar /bar/api

Spring Boot与GraphQL – 篇三 集成开发

Spring Boot与GraphQL – 篇三 集成开发

[toc] Spring Boot与GraphQL – 篇三 集成开发 在了解了GraphQL相关概念,以及使用的方法后,就该进入到实操阶段了。使用常用的springboot来搭建服务,并提供GraphQL查询。 配置 在Spring Boot中集成GraphQL非常简单,只需引入两个包 pom.xml <dependency> <groupId>com.graphql-java</groupId> <artifactId>graphql-spring-boot-starter</artifactId> <version>4.0.0</version> </dependency> <dependency> <groupId>com.graphql-java</groupId> <artifactId>graphql-java-tools</artifactId> <version>4.3.0</version> <dependency> 定义Schema 推荐在resources目录下建立graphql文件夹,在其中建立root.graphqls和schema.graphqls两个文件。一般会在root.graphqls文件中放Query或者Mutation的接口定义,在schema.graphql…

阅读全文 Read More

Spring Boot与GraphQL – 篇二 Schema格式与规范

Spring Boot与GraphQL – 篇二 Schema格式与规范

模式 Schema 在了解了GraphQL是如何查询以及如何变更数据后,我们需要进一步了解一下。对于客户端来说,需要在请求数据前知道数据的格式,包括有哪些field,这些字段的子对象又有哪些,子对象又是什么样的数据结构。这样就出现了schema的概念。 对象类型与字段 在GraphQL的schema中,构成的基本元素就是对象object类型type,即指定你想要获取的对象,以及想要获取的对象的字段,例如: type Character { name: String! appearsIn: [Episode!]! } Character定义了一个为GraphQL对象类型 name和appearsIn为Character类型中的字段 String是一个预定义的标量类型 String!表示此字段不可为空 [Episode!]!表示返回的是一个Episode对象列表,并且也是非空的 参数 每个GraphQL对象的字段都可以有若干个参数,例如下面例子中的length字段: type Starship { id: ID! name: String! length(unit: LengthUnit = METER): Float } 参数都需要预先定义好,例如上面例子中,unit就是length的一个参数。参数可以是必需也可以是可选,当一个参数是可选时,可以定义默认值。如果不给unit传递参数,那么METER即为默认值。 查询与变更类型 schema中大多数类型都是对象类型,除此之外,还有两种重要类型:查询que…

阅读全文 Read More

Spring Boot与GraphQL – 篇一 如何进行查询

Spring Boot与GraphQL – 篇一 如何进行查询

背景介绍 GraphQL,由Facebook开源,并在github api v4中得到了使用,替代了v3中restful的地位。既然大厂使用,那就得去看看到底是个什么货色。 GraphQL相对于传统的restful接口,主要是在灵活性上有较大改进。例如,要增加一个属性返回,之前的做法可能需要更改接口的返回对象;如果属性越加越多,可能衍生出多个接口(包含返回少量的和大量的数据),也可能由此诞生一个巨大的接口(包含所有的数据);如果是多个对象的组合,由于组合的形式多种多样,有可能也会造成多个接口的产生。 而解决此缺点的做法是,客户端根据自己的需求来传递请求参数,参数中指明需要哪些数据,则服务器端根据这些参数返回给客户端所需要的数据。这样,关于数据的特定字段、或者组合、聚合类的需求,都无需服务端关心,客户端自己确定就好。 查询与变更 Queries and Mutations 字段 Fields 客户端通过指定Fields来控制返回的数据,Fields即为请求的数据,类似字段的含义。指定了服务端定义好的标量,例如: 请求 { hero { name # Queries can have comments! friends { name } } } 响应 { “data”: { “hero”: { “name”: “R2-D2”, “friends”: [ { “name”: “Luke Skywalker” }, { “name”: “Han Solo” }, { “name”: “Leia Organa…

阅读全文 Read More

springboot集成整合mongodb

springboot集成整合mongodb

springboot集成整合mongodb 在非关系型数据库的使用中,mongodb的出镜率现在也不小了,在最近做地图相关的项目中,关于海量轨迹数据的存储也选型了此数据库。在springboot中集成mongodb也非常简单,spring data模块提供了开箱即用的功能。 配置 首先向项目中引入依赖,修改pom.xml文件: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> 并在配置文件application.properties中配置连接池相关参数: spring.data.mongodb.uri=mongodb://username:password@localhost:27017/test_db 或者 spring.data.mongodb.username=username spring.data.mongodb.password=password spring.data.mongodb.database=test_db spring.data.mongodb.host=localhost spring.data.mongodb.prot=27017 通过以上两步,springboot应用到mongodb的连接就已…

阅读全文 Read More

二分搜索 Binary search

二分搜索 Binary search

二分搜索也是比较常见的,在生活中的应用尤其广泛。比如在酒桌上玩猜数字,一个人坐庄先准备一个在一定范围内的数字,其余每个人轮流猜一次,庄说出是大了还是小了,说中的人喝。这个游戏玩过的人应该不少,其中肯定有许多人都是从中间开始猜,认为这样是比较快的排除方法。是的,这就是二分搜索。 二分搜索对于查找对象有要求,即有序。原理就是取其中间进行判断,如果未找到,则根据顺序关系再分别对两边其中的一个子区进行再次查找,直到找到或者未发现,搜索结束。 public static void main(String[] args) { int[] array = {1, 12, 13, 27, 34, 38, 49, 50, 64, 65, 76, 78, 97}; int target = 50; System.out.println(“result index:” + binarySearch(array, target)); } public static int binarySearch(int[] arr, int target) { int startPosition = 0; // 设置搜索的上下界 int endPosition = arr.length – 1; while (startPosition <= endPosition) { // 在搜索过程中,会逐渐缩小搜索范围 int midPosition = (startPosition + endPosition) / 2; // 确定中间…

阅读全文 Read More

顺序搜索 sequential search

顺序搜索 sequential search

顺序搜索是所有搜索算法中,最简单最无脑的,原理就是穷举,一个一个的比对,直到找到为止。所以对于被搜索的对象也没有任何要求,并不像其他的某些算法那样要求有序等等。 public static void main(String[] args) { int[] array = {49, 38, 65, 97, 76, 13, 27, 50, 78, 34, 12, 64, 1}; int target = 50; System.out.println(“result index:” + sequentialSearch(array, target)); } public static int sequentialSearch(int[] arr, int target) { for (int i = 0; i < arr.length; i++) { // 遍历整个数组 if (arr[i] == target) { // 如果找到,则返回对应的下标 return i; } } return -1; // -1表示未找到 }

快速排序 Quick Sort

快速排序 Quick Sort

快速排序也算是很出名的一种算法了,虽然说是不稳定的,但在各类面试笔试中出现的频率相当高。并且相较一些排序算法来说,快速排序的核心思路也比较简单: 挑选一个数target(一般为第一个),经过一次遍历比较后,将比此数小的,放在其前面,比此数大的,放在其后面。此数的前后序列都是无序的。此过程通常称为分区(partition)。其中交换的逻辑是比较重要的,具体为:有一个指针index指向第二个数,并且从第二个开始(第一个为target,不参与)遍历,如果比选定数小,则index后移,并且交换index与i;如果比选定数大,则直接进入下一次循环。 整个循环完成后,最后交换target与index。 则此被挑选的数的位置就确定了,然后再递归排序前后两个无序的数组即可。 int[] array = {49, 38, 65, 97, 76, 13, 27, 50, 78, 34, 12, 64, 1}; quickSort(array, 0, array.length – 1); static void quickSort(int[] array, int startPos, int endPos) { if (endPos > startPos) { // 设置终止条件 int target = array[startPos]; // 保存目标中间数 int index = startPos; // 设置索引位置 for (int i = startPos + 1; i <= endPos; i++…

阅读全文 Read More

归并排序 Merge sort

归并排序 Merge sort

归并排序相对于上两个的思路不同,并不是遍历单条序列找最大或最小的思路,最主要的是递归思想。假定有两个有序序列,将其合并为一个有序序列,所需要做的就是不断取出两个序列中最小的,并将其中较小的放在新的序列中,则最后合并得到的序列仍然是有序的序列,这就是所谓归并。 要归并排序一个序列,可以先将其分成两部分,分别进行排序,得到的就是两个有序序列,再按照如下步骤进行。 有两个指针分别指向两个有序序列的首位。 比较两个指针对应的大小,小的放入新序列,并且此指针向后移,再重复比较。 int[] array = {3, 5, 7, 4, 2, 1, 6}; mergeSort(array, 0, array.length – 1); // 指定排序范围 public static void mergeSort(int[] arr, int start, int end) { if (start == end – 1) { // 如果起始与终点相邻,则将两者进行比对 if (arr[start] > arr[end]) { int temp = arr[start]; arr[start] = arr[end]; arr[end] = temp; } } else if (start < end – 1) { // 如果排序子集大于三个,则需要进行递归操作 int mid = (start + end) / 2; // 选取中间点 mergeSort(arr, start, mid); // 前半部分进行…

阅读全文 Read More

希尔排序 Shell sort

希尔排序 Shell sort

我认为希尔排序的思想是比较另类的,属于插入排序的一个变种。由于插入排序在插入新数时需要遍历整个序列,希尔排序针对这种情况做出了修改:将整个序列分为几部分分别进行插入排序,而希尔排序的分组比较有意思,并不是像切肉一样简单分为几个连续的部分,而是设定了一个小于数组长度的跨度d(d通常小于数组长度/2),每隔d长度的为一组。假设共有10个数,d为3的情况,分组即为{0,3,6,9},{1,4,7},{2,5,8}这样三组。这一步的优点一是,由于每个子序列变短了,虽然总的需要排序的个数不变,但移动次数减少;优点二是可以将较小的数尽量快的放到整个数组的前面;例如按上面的分组第一次排序后,下标为0,1,2的元素均为个分组中最小的。然后将d缩短,即子序列变短,再对每部分进行插入排序,直到d=1时,无需排序,则完成整个序列的排序。 设定初始跨度d=array.length/2,相隔相同跨度的为一组,进行插入排序。 缩小跨度d,d=d/2,再此进行分组与插入排序。 d=1时结束。 int[] array = {6, 5, 3, 1, 8, 7, 2, 4}; int d = array.length; while (d > 1) { // 控制跨度 d = d / 2; // 每次跨度缩小一半 for (int start = 0; start < d; start++) { // 每个分组的起点 for (int currPos = start + d; currPos < array.lengt…

阅读全文 Read More