Spring cloud实战 从零开始一个简单搜索网站_freemark 以及configserver的应用(二)

news/2024/5/20 9:28:34/文章来源:https://blog.csdn.net/weixin_30505225/article/details/98970635

先来说下我的网站架构吧  

 

 

前面大家也看到了  既然叫博客搜  自然是搜索 博客的   我把每个网站会抽象成一个Client (为了更好的学习cloud) 

上面只是展示了主要部分  像Hystrix Ribbon  Zuul等等就不画上去了

下面我们再建一个Client  选Eureka Server就可以了

修改下Application

 

@EnableEurekaClient
@SpringBootApplication
public class SpringtestCsdnApplication {public static void main(String[] args) {SpringApplication.run(SpringtestCsdnApplication.class, args);}
}

修改下Application.properties

eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
spring.application.name=csdn
server.port=8981

新建一个Controller

@RestController
public class CsdnController {@RequestMapping(value ="/search")public String search(@RequestParam("key") String key,@RequestParam("page") String page) {return "hello";}
}

 

测试下 

下面是爬取CSDN搜索的接口 ,比较简单  没做什么处理

这里我们引入了 谷歌的GSON 包  方便处理数据

打开pom.xml 在里面加如GSON 引用

 

            <dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId></dependency>

 

 

 

 

public class SearchUtil {public static Gson gson = new Gson();public static ArrayList<HashMap<String, String>> search(String key,String type,String page) throws Exception {StringBuffer url =new StringBuffer("https://so.csdn.net/so/search/wap.do?callback=&q=");url.append(key);url.append("&t=");url.append(type);url.append("&p=");url.append(page);url.append("&o=&s=&l=&_=");url.append(System.currentTimeMillis());URL serverUrl = new URL(url.toString());System.out.println(url.toString());HttpURLConnection conn = (HttpURLConnection) serverUrl.openConnection();conn.setConnectTimeout(5000);InputStream in = conn.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));StringBuffer sb = new StringBuffer();String line;while ((line = br.readLine()) != null) {sb.append(line);}Map<String, Object> map = gson.fromJson(sb.toString(), new TypeToken<HashMap<String, Object>>() {}.getType());ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();ArrayList<LinkedTreeMap<String, String>> mlist = (ArrayList<LinkedTreeMap<String, String>>) map.get("lresult");HashMap<String, String> m;for (LinkedTreeMap<String, String> o : mlist) {m = new HashMap<String, String>();m.put("title", convertString(o.get("title"),key));m.put("content", convertString(o.get("digest"),key));m.put("link", o.get("url"));list.add(m);}return list;}public static String convertString(String str,String key) {
//        if(key.contains("+")) {
//             String[] s = key.split("[+]");
//            for (int i = 0; i < s.length; i++) {
//                key = s[i];
                if (str != null) {str = str.replaceAll("<em>", "").replaceAll("</em>", "").replaceAll("amp;", "");}
//                str = str.replaceAll("(?i)" + key, "<em>" + key + "</em>");
//            }
//            
//        }
//        else {
//            if (str != null) {
//                str = str.replaceAll("<em>", "").replaceAll("</em>", "").replaceAll("amp;", "");
//            }
//            str =str.replaceAll("(?i)"+key, "<em>"+key+"</em>");
//        }return str;}
}
View Code

 

 

修改下Controller

@RestController
public class CsdnController {Gson gson = new Gson();@RequestMapping(value = "/search")public String search(@RequestParam("key") String key, @RequestParam("page") String page) {System.out.println("search");ArrayList<HashMap<String, String>> result;try {result = SearchUtil.search(key, "blog", page);return gson.toJson(result);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}
}
View Code
View Code

重新测试下接口

 

数据已经有了  

我们的CSDN端是不直接访问的 , 需要通过Client来访问  下面可以结合下前面做的搜索框了

回到Client项目   我们先新建一个service 用来处理 连接 CSDN 

@Service
public class ClientService {@Autowired RestTemplate restTemplate;public String  search(String key,String page) {HashMap<String, String> map = new HashMap<>();map.put("key", key);map.put("page", page);String str= restTemplate.getForObject("http://localhost:8981/search?key={key}&page={page}",String.class,map);return str;}@BeanRestTemplate restTemplate() {return new RestTemplate();}
}

修改下Client 下面的Controller

@RestController
public class ClientController {@AutowiredClientService cs;@RequestMapping(value ="/search")public String search(@RequestParam("key") String key,@RequestParam("page") String page) {return cs.search(key, page);}
}

 

修改下我们的index.ftl    就是前面的页面

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title><style>.searchBtn{background-color:#38f;color:#fff;font-size: 16px;padding-top: 0px;width: 80px;height: 34px;vertical-align: middle;padding: 0;border: 0;}.searchBtn:hover {background-color: #3171f3;}.searchBtn:active {background-color: #2964bb;}.searchSpan{padding-left: 10px;padding-right: 10px;margin-top: 0px;margin-bottom: 0px;border-color: #b8b8b8;width: 40%;vertical-align: middle;display: inline-block;height: 34px;border: 1px solid #b6b6b6;}.searchText{font-size: 16px;width: 100%;margin-top: 5px;outline: 0;border: 0;}dt{margin: 0px;padding: 0px;font-size: 16px;color: #303030;line-height: 24px;margin-top: 20px;}dd{margin: 0px;padding: 0px;font-size: 14px;line-height: 22px;color: #999999;}a{text-decoration: none;}.contentDiv{width: 800px;text-align: left;padding-bottom: 30px;}.contentDiv em{color: #CA0C16;font-style:normal;}.nextdiv{width: 50px;height: 50px;position: relative;}.next a:visited {text-decoration: none;color: #9B8878;
}</style><script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.0.js"></script>
<script >
String.prototype.replaceAll = function(s1,s2){ return this.replace(new RegExp(s1,"gm"),s2); 
}
$(document).ready(function(){var width =$(window).width();if(width<900){$(".searchSpan").css("width","50%")$(".searchBtn").css("width","20%")$("#contentDiv").css("width","80%")}else{$(".searchSpan").css("width","600px")$("#contentDiv").css("width","800px")$(".searchBtn").css("width","80px")$(".searchSpan").css("margin-left","-85px")}$('.searchText').bind('keydown',function(event){if(event.keyCode == "13") {openSearch(0);}});  
});function openSearch(state){if(state!=null){$("#contentDiv").html("");}isLoad = true;$.ajax({type: "GET",url: "search",data: {"key":$("#searchText").val(),"page":1},dataType: "text",success: function(data){$("contentDiv").html(data);}});}</script></head><body ><div align="center" style="margin-top: 30px;font-size: 24px;margin-left: -50px;"  >博客搜</div><div align="center" style="margin-top: 20px;"  ><span class="searchSpan"><input type="text" id="searchText"value="spring"class="searchText" /></span><input type="submit" value="Search" id="su" class="searchBtn"onclick="openSearch(0)"></input></div><div align="center"><div id="contentDiv" class="contentDiv" ></div></div></body>
</html>
View Code

访问下   好的 一个丑陋的网站就做好了

 

回到ClientService

我们这边是用    String str= restTemplate.getForObject("http://localhost:8981/search?key={key}&page={page}",String.class,map);

restTemplate直接访问真实地址的   这样比较low, 通过Eureka Server上注册的Application Name我们可以来直接访问Client

修改下ClientService 

@Service
public class ClientService {@Autowired RestTemplate restTemplate;@Autowiredprivate EurekaClient discoveryClient;public String  search(String key,String page) {HashMap<String, String> map = new HashMap<>();map.put("key", key);map.put("page", page);String str= restTemplate.getForObject(serviceUrl("CSDN")+"/search?key={key}&page={page}",String.class,map);return str;}@BeanRestTemplate restTemplate() {return new RestTemplate();}public String serviceUrl(String serviceId) {InstanceInfo instance = discoveryClient.getNextServerFromEureka(serviceId, false);return instance.getHomePageUrl();}
}

 

这里需要说明下 用了rabbit  如果直接访问真实地址会找不到 ,默认是通过serviceID解析 

 

继续测试下 没问题

我们把CSDN 写死在代码里  看着很不舒服  下面就是将服务名通过ConfigServer获取

新建个 工程 

 

 

application.properties

eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
spring.application.name=config
server.port=8782
spring.cloud.config.server.git.uri=https://github.com/dikeboy/myeureka_config.git
spring.cloud.config.server.git.search-paths=config

我 这里是通过Github仓库获取的 uri是GIT仓库名  paths代表要搜索的路径 ,当然也可以配置在本地

 

 

 

 

Application

@EnableEurekaClient
@EnableConfigServer
@SpringBootApplication
public class SpringtestConfiApplication {public static void main(String[] args) {SpringApplication.run(SpringtestConfiApplication.class, args);}
}

 

 

访问下成功  说明已配置成功

 

 

 

下面回到Client项目   在resource 下新建一个bootstrap.xml或者properties  bootstrap.xml优先级高于application.xml

spring.application.name=client
server.port=8881
spring.cloud.config.label=master
spring.cloud.config.profile=dev
spring.cloud.config.uri=http://localhost:8782/

 

Github上的名字client-dev.properties ,   client是我们当前服务的名称 dev对应  uri是我们config server的地址  

Pom加入

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency>

修改Client Service 

package com.springtest.client;import java.util.HashMap;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;import com.netflix.appinfo.InstanceInfo;
import com.netflix.discovery.EurekaClient;@Service
public class ClientService {@Autowired RestTemplate restTemplate;@Autowiredprivate EurekaClient discoveryClient;@Value("${serviceId}")public String serviceId;public String  search(String key,String page) {HashMap<String, String> map = new HashMap<>();map.put("key", key);map.put("page", page);String str= restTemplate.getForObject(serviceUrl(serviceId)+"/search?key={key}&page={page}",String.class,map);return str;}@BeanRestTemplate restTemplate() {return new RestTemplate();}public String serviceUrl(String serviceId) {InstanceInfo instance = discoveryClient.getNextServerFromEureka(serviceId, false);return instance.getHomePageUrl();}
}
View Code

 

这里需要注意几点 使用@value注入  一定要保证Config Server正常启动的状态  配置文件不能出错  不然可能启动不了项目

再次访问下地址测试下

 

 

 

 

 

转载于:https://www.cnblogs.com/dikeboy/p/10052921.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_848739.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用postman访问网站

1、输入Request URL2、选择Request Method3、输入需要的Request Headers注意&#xff1a;一般token会在Headers中 转载于:https://www.cnblogs.com/jishugaochao/p/10192076.html

互联网网站架构升级----分布式环境的构建

随着网络流量爆发式增长&#xff0c;几百人维护一个项目将是一个可怕的噩梦&#xff0c;业务拆分势在必行。拆分的业务形成一个个独立的系统&#xff0c;系统间的协调又变成了一个棘手的问题&#xff0c;所以维护这些系统间协调关系的分布式环境组件将发挥至关重要的作用。 由于…

scrapy-redis案例(一)爬取中国红娘相亲网站

前言&#xff1a;本案例将分为三篇。 第一篇&#xff0c;使用scrapy框架来实现爬取中国红娘相亲网站。 第二篇&#xff0c;使用scrapy-redis 简单的方式爬取中国红娘相亲网站。&#xff08;使用redis存储数据&#xff0c;请求具有持续性&#xff0c;但不具备分布式&#xff09;…

scrapy-redis案例(二)爬取中国红娘相亲网站

前言&#xff1a;本案例将分为三篇。 第一篇&#xff0c;使用scrapy框架来实现爬取中国红娘相亲网站。 第二篇&#xff0c;使用scrapy-redis 简单的方式爬取中国红娘相亲网站。&#xff08;使用redis存储数据&#xff0c;请求具有持续性&#xff0c;但不具备分布式&#xff09;…

scrapy-redis案例(三)爬取中国红娘相亲网站

前言&#xff1a;本案例将分为三篇。 第一篇&#xff0c;使用scrapy框架来实现爬取中国红娘相亲网站。 第二篇&#xff0c;使用scrapy-redis 简单的方式爬取中国红娘相亲网站。&#xff08;使用redis存储数据&#xff0c;请求具有持续性&#xff0c;但不具备分布式&#xff09;…

python-scrapy模拟登陆网站--登陆青果教务管理系统(一)

前言&#xff1a; 第一篇&#xff0c;分析青果教务管理系统登陆模块&#xff0c;理清思路 第二篇&#xff0c;使用常规的python常用库 requests来实现模拟登陆 第三篇&#xff0c;使用scrapy来实现模拟登陆 目的在于了解模拟登陆网站的要点和方法&#xff0c;了解http请求的一些…

python-scrapy模拟登陆网站--登陆青果教务管理系统(二)

前言&#xff1a; 第一篇&#xff0c;分析青果教务管理系统登陆模块&#xff0c;理清思路 第二篇&#xff0c;使用常规的python常用库 requests来实现模拟登陆 第三篇&#xff0c;使用scrapy来实现模拟登陆 目的在于了解模拟登陆网站的要点和方法&#xff0c;了解http请求的一些…

python-scrapy模拟登陆网站--登陆青果教务管理系统(三)

前言&#xff1a; 第一篇&#xff0c;分析青果教务管理系统登陆模块&#xff0c;理清思路 第二篇&#xff0c;使用常规的python常用库 requests来实现模拟登陆 第三篇&#xff0c;使用scrapy来实现模拟登陆 目的在于了解模拟登陆网站的要点和方法&#xff0c;了解http请求的一些…

【问底】徐汉彬:大规模网站架构的缓存机制和几何分形学

【问底】徐汉彬&#xff1a;大规模网站架构的缓存机制和几何分形学 发表于18小时前| 2273次阅读| 来源CSDN| 14 条评论| 作者徐汉彬问底CDN缓存徐汉彬allowtransparency"true" frameborder"0" scrolling"no" src"http://hits.sinajs.cn/A1/…

在IIS上部署PHP网站

1、启动iis服务器&#xff0c;打开IIS服务器 打开IIS服务器&#xff0c;点击网站&#xff0c;右击“添加网站” 2、创建网站 点击“添加网站”后&#xff0c;进入页面填写网站相关内容&#xff0c;如&#xff1a;网站名称、物理路径(网站所在文件夹),点击“确定”创建成功 3、…

借助花生壳把内网网站映射给外网。(内网穿透/路由器端口映射)、外网控制内网...

其实这个东西几年前我就弄过&#xff0c;但是当时心智不成熟&#xff0c;没学会怎么玩耍&#xff0c;今天玩了一把也没啥的&#xff0c; 1.搭建网站 假设内网电脑是192.168.100.9 访问Http://192.168.100.9能打开网站,这样就ok了&#xff0c;不能用的自己百度. 2. 端口映射 貌似…

多个端口指定多个目录。花生壳多个域名多个网站

配置php网站 打开httpd.conf Listen 88 Listen 8888 打开vhost.conf Listen 80NameVirtualHost *:80 <VirtualHost *:88> ServerName localhost DocumentRoot "D:/phpStudy/WWW"<Directory "D:/phpStudy/WWW">Options -Indexes FollowSymLinks…

大型网站数据库优化及浅析大型网站的架构(转)

大型网站数据库优化 千万人同时访问的网站&#xff0c;一般是有很多个数据库同时工作&#xff0c;说明白一点就是数据库集群和并发控制&#xff0c;这样的网站实时性也是相对的。这些网站都有一些共同的特点&#xff1a;数据量大&#xff0c;在线人数多&#xff0c;并发请求多…

解决github网站 git 操作太慢问题

上网查找改善方法解决了问题&#xff1a; 思路&#xff1a;git clone 特别慢是因为github.global.ssl.fastly.Net域名被限制了。只要找到这个域名对应的ip地址&#xff0c;然后在hosts文件中加上ip–>域名的映射&#xff0c;刷新DNS缓存就可以了 1.获取 global.ssl.fastly地…

漏洞库网站

关于漏洞的国内外网站

IIS网站部署——基本流程

近期在一个项目中用到了IIS服务器,在学习使用的过程中遇到了很多问题&#xff0c;下面先对IIS网站部署的基本流程做个简单介绍。 以Windows 7 64位系统为例 一.IIS服务开启 1.打开Windows功能 依次打开控制面板 — 程序&#xff0c;再点击“打开或关闭Windows功能”&#xf…

Springboot 系列(十四)迅速启用 HTTPS 加密你的网站

点赞再看&#xff0c;动力无限。Hello world : ) 微信搜「 程序猿阿朗 」。 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录&#xff0c;有很多知识点和系列文章。 1. 获取 HTTPS 证书 正常情况下 HTTPS 证书需要从证书授权中心获得&#xff0c;这样获得的证书才…

网站跨域传递的原理+同源策略+src跨域+callback回调函数

一&#xff0c;传输数据的几种数据格式 1&#xff0c;Html Html由一些普通文本组成。如果服务器通过XMLHTTPRequest发送html&#xff0c;文本将存储在responseText属性中。 从服务器端发送的html的代码在浏览器端不需要用JavaScript进行解析。 可以直接使用innerHTML属性把服务…

宝塔同时安装苹果cms海洋cms_安装网站程序

一、选择网站程序搭建网站的程序有很多博客类&#xff1a; WordPress、 Typecho 、Hexo 等商城类&#xff1a;EcShop、DBShop、NiuShop 等论坛类&#xff1a;Discuz 还有 苹果CMS-影视建站&#xff1b;Tipask-问答程序&#xff1b;可道云KodExplorer-强大易用的私有云/在线文档…

bitnami搭建php网站,BitNami 开源PHP程序傻瓜集成安装环境

loading...bitnami.org 提供wordpress、jumla、drupal、bbpress等开源程序的傻瓜式安装包下载&#xff0c;所有的安装包内置了服务器环境&#xff0c;就是说&#xff0c;不需要在本地电脑上另外搭建服务器&#xff0c;就可以一次性傻瓜式安装完毕。BitNami开源PHP程序傻瓜集成安…