爬虫 spider11——搭建分布式架构通过feign技术,开发服务消费者
搭建分布式架构,把3中开发的服务提供者,注册到eureka server(三台,7001,7002,7003)
开发服务消费者(可以直接访问3中的服务),调试成功后,
通过feign技术,开发服务消费者,并注册到eureka server中。
接https://blog.csdn.net/qq_41946557/article/details/102584047
搭建elk平台,开发服务提供者
和https://blog.csdn.net/qq_41946557/article/details/102573282
爬取指定数据,去重复,并存储到mysql
- 搭建分布式架构,把3中开发的服务提供者,注册到eureka server(三台,7001,7002,7003)
1.三台eureka server
Pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>com.henu.spider</artifactId>
<groupId>com.henu</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>spider_eureka_7001</artifactId>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--eureka-server服务端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<!-- 修改后立即生效,热部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>
EurekaServer7001App
package com.henu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer//EurekaServer服务器端启动类,接受其它微服务注册进来
public class EurekaServer7001App {
public static void main(String[] args) {
SpringApplication.run(EurekaServer7001App.class, args);
}
}
application.yml
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
spider_eureka_7002和spider_eureka_7003中
修改每个配置,如server.port、eureka.instance.hostname、eureka.client.service-url.defaultZone
2.修改spider_provider
添加pom.xml
<!-- 将微服务provider侧注册进eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!--****************************************-->
<!-- hystrix -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
添加application.yml
eureka:
client: #客户端注册进eureka服务列表内
service-url:
#defaultZone: http://localhost:7001/eureka
defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka,http://localhost:7003/eureka
instance:
instance-id: spider_provider
prefer-ip-address: true #访问路径可以显示IP地址
修改SpringbootElasticsearchApplication启动类
package com.henu.es;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
/**
* 操作elasticsearch有两种方式:
* (1)jest:默认不生效,需要导入包io.searchbox.jest
* 配置application.properties,测试添加文档和查询文档
* (2)spring-data-es:导入spring-data-elasticsearch包
* 配置application.properties:cluster-name cluster-nodes
* 启动要是报错:可能是版本不匹配
* 两种用法:
* (1)编写接口继承elasticsearchRepository
* (2) elasticsearchTemplate
* (3)spring-data-es CRUD + 分页 + 高亮的练习
*
*/
@SpringBootApplication
@EnableEurekaClient //本服务启动后会自动注册进eureka服务中
@EnableCircuitBreaker //启用hystrix熔断机制
public class SpringbootElasticsearchApplication {
public static void main(String[] args) {
// 避免netty冲突
System.setProperty("es.set.netty.runtime.available.processors", "false");
SpringApplication.run(SpringbootElasticsearchApplication.class, args);
}
}
修改SpiderController
@RestController
public class SpiderController {
@RequestMapping("/search")
@HystrixCommand(fallbackMethod = "processHystrixDeptGet")//服务熔断
public String search(@RequestParam(value = "keyword")String keyword, @RequestParam(value="currentPage",defaultValue = "1") int currentPage, @RequestParam(value="pageSize",defaultValue = "10") int pageSize){
System.out.println("好好学习,天天向上:"+keyword);
QueryBuilder queryBuilder = QueryBuilders.matchQuery("intro", keyword);
EsPage esPage = ElasticsearchUtil.searchDataPage("spider", currentPage, pageSize, queryBuilder, "id,appid,title,intro,url,source,updatetime", "id", "intro");
return esPage.toString();
}
public String processHystrixDeptGet(@RequestParam(value = "keyword")String keyword, @RequestParam(value="currentPage",defaultValue = "1") int currentPage, @RequestParam(value="pageSize",defaultValue = "10") int pageSize){
System.out.println("error");
return "error111";
}
}
- 开发服务消费者(可以直接访问3中的服务),调试成功后,通过feign技术,开发服务消费者,并注册到eureka server中。
- 开发服务消费者
(1)配置类:
RandomRule_Five
public class RandomRule_Five extends AbstractLoadBalancerRule {
private int total = 0; //总共被调用的次数,目前要求每台被调用5次
private int currentIndex = 0;//当前提供服务的机器号
public Server choose(ILoadBalancer lb, Object key) {
if (lb == null) {
return null;
}
Server server = null;
while (server == null) {
if (Thread.interrupted()) {
return null;
}
List<Server> upList = lb.getReachableServers();
List<Server> allList = lb.getAllServers();
int serverCount = allList.size();
if (serverCount == 0) {
/*
* No servers. End regardless of pass, because subsequent passes
* only get more restrictive.
*/
return null;
}
// int index = rand.nextInt(serverCount);
// server = upList.get(index);
if(total < 5)
{
server = upList.get(currentIndex);
total++;
}else {
total = 0;
currentIndex++;
if(currentIndex >= upList.size())
{
currentIndex = 0;
}
}
if (server == null) {
/*
* The only time this should happen is if the server list were
* somehow trimmed. This is a transient condition. Retry after
* yielding.
*/
Thread.yield();
continue;
}
if (server.isAlive()) {
return (server);
}
// Shouldn't actually happen.. but must be transient or a bug.
server = null;
Thread.yield();
}
return server;
}
@Override
public Server choose(Object key) {
return choose(getLoadBalancer(), key);
}
@Override
public void initWithNiwsConfig(IClientConfig clientConfig) {
}
}
RibbonConfig
@SpringBootConfiguration
public class RibbonConfig {
@Bean
public IRule getRule(){
//return new RandomRule();指定负载均衡算法
return new RandomRule_Five();
}
}
(2)控制层
NewsControllerConsumer
@RestController
public class NewsControllerConsumer {
@Autowired
private SpiderClientService service;
/**
* 在客户端执行远程访问,访问服务发现接口
*
* @return
*/
@RequestMapping(value = "/consumer/search")
public String list(@RequestParam(value = "keyword") String keyword, @RequestParam(value = "currentPage", defaultValue = "1") int currentPage, @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
System.out.println("nihao");
//请求转发
return service.search(keyword, currentPage, pageSize);
}
}
(3)工厂类
SpiderClientServiceFallbackFactory
@Component
public class SpiderClientServiceFallbackFactory implements FallbackFactory<SpiderClientService> {
@Override
public SpiderClientService create(Throwable throwable) {
return new SpiderClientService(){
@Override
public String search(String keyword, int currentPage, int pageSize) {
return "dddddddd";
}
};
}
}
- 业务层接口
SpiderClientService
//使用feign,并制定服务
@FeignClient(value = "SPIDER8001",fallbackFactory = SpiderClientServiceFallbackFactory.class)
public interface SpiderClientService {
@RequestMapping("/search")
String search(@RequestParam(value = "keyword")String keyword, @RequestParam(value="currentPage",defaultValue = "1") int currentPage, @RequestParam(value="pageSize",defaultValue = "10") int pageSize);
}
(5)启动类
SpiderConsumer9001App
@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name="SPIDER8001")
@EnableFeignClients(basePackageClasses = SpiderClientService.class)
@EnableHystrixDashboard
public class SpiderConsumer9001App {
public static void main(String[] args)
{
SpringApplication.run(SpiderConsumer9001App.class, args);
}
}
- application.yml
server:
port: 9001
context-path: /
eureka:
client: #客户端注册进eureka服务列表内
service-url:
#defaultZone: http://localhost:7001/eureka
defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka,http://localhost:7003/eureka
register-with-eureka: false
feign:
hystrix:
enabled: true #启用hystrix
- Pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>com.henu.spider</artifactId>
<groupId>com.henu</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>spider_consumer_01</artifactId>
<packaging>war</packaging>
<name>spider_consumer_01 Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--*************************************************************-->
<!-- 将微服务provider侧注册进eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!--************************************-->
<!-- Ribbon相关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<!-- feign相关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<!-- hystrix和 hystrix-dashboard相关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
全部启动成功后!
展示结果:
首先eureka
访问http://localhost:9001/consumer/search?keyword=黄
ok!!!继续加油。
爬虫 spider11——搭建分布式架构通过feign技术,开发服务消费者相关推荐
- 搭建分布式架构4--ZooKeeper注册中心安装
2019独角兽企业重金招聘Python工程师标准>>> ZooKeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务--分布式同步(Distr ...
- 万字长文解析:分布式架构、SOA、微服务架构、API网关、ESB服务总线架构之间的关联及演进
1架构演进 架构十五年:改变的是形态,不变的是目的 业务驱动架构形态变化 过去十几年,随着互联网发展以及业务的多样化,系统的架构也在不断发生变化,总体上来说大体经历了从单体应用架构-垂直应用架构-分布 ...
- java简单搭建分布式架构
一般来说,数据库的数据过多,查询效率就很慢,这时候我们如果把表分库到不同的数据库,这时候访问速度就会快很多,如果并且采用多线程去访问的话,查询速度也会提高的更快,我这里是运行内存8核电脑进行测试的单个 ...
- 一文看懂Java微服务架构,WEB2.0,垂直架构,分布式架构,微服务架构
Java微服务架构 目录: 了解开发环境&生成环境 WEB1.0 & WEB2.0 垂直架构 分布式架构 微服务架构 1.了解开发环境&生产环境 1.1 开发环境 平时在写代码 ...
- 基于Licode的WebRTC全球分布式架构
随着在线教育行业的兴起, 许多人把目光投向了国外市场,而如何搭建全球化的音视频网络就成为了其中的关键问题.百家云研发工程师陈聪详细介绍了如何利用Licode 开源服务器搭建全球分布式架构以解决常见的教 ...
- 微众银行:分布式架构之高可用
作者:Noe来源:51CTO [51CTO.com原创稿件]导言 在互联网金融快速发展的当下,面对爆发式增长的数据量.高并发海量交易场景,传统集中式架构的性能瓶颈愈发凸显.基于此,越来越多的银行等金融 ...
- 广发证券基于分布式架构的新一代估值系统实践
文 / 广发证券信息技术部 来源 / 金融电子化 随着信息技术应用创新试点范围不断扩大,能否胜任更多业务场景,是各行各业当前阶段选型数据库的关键.早在 2019 年,广发证券即开启对分布式架构的数据库 ...
- 分布式架构演变和Dubbo
分布式架构演变和Dubbo 官方文档 从最初开发的单体应用,到后面的垂直应用架构,随着网络流量大时代的到来,垂直应用架构已无法满足越来越庞大的流量需求,分布式服务架构以及流动计算架构势在必行,亟需一个 ...
- 软件架构-从0到1认知分布式架构(上)
不管之前接触过分布式的没有,有没有分布式的经验,跟着老铁我一起看看熟悉下,绝对收获满满,里面可是有段子啊~ ####(一)分布式发展的历史和背景 场景 一家做政府系统OA系统的公司老板,发现跟竞争对手 ...
最新文章
- java gif 帧_在Java中修复动画gif的帧速率
- php的异常处理,PHP异常处理Exception类
- 哪些情况下索引会失效?
- Cookie和Session的区别详解
- 适用于ATI卡的GPU计算MD5的小程序源码,基于AMD APP SDK开发
- 有用的Copy-On-write,写时复制
- hanlp中文分词、提取摘要关键字、语句分析、智能推荐
- 面向对象软件设计原则(一) —— 引子
- mysql中间件研究(Atlas,cobar,TDDL,Mycat)
- DHTML【3】--HTML
- 【NumPy基础】100道numpy练习——进阶篇
- 51单片机 code关键字
- 华为h12m03装系统_华为H22H-03服务器怎么设置从U盘装系统
- js模板引擎—art-template的使用
- 博客好助手——截图工具Snipaste试用
- 计算机f2锁定用户,台式电脑键盘被锁住按什么键恢复 点锁定直接锁定计算机
- linux远程取证,linux系统取证
- asm MGMT库迁移
- iOS开发之应用首次启动显示用户引导 - 疯狂的萝卜 - 博客园
- Zookeeper框架Curator使用
热门文章
- CodeForces - 1529F It‘s a bird! No, it‘s a plane! No, it‘s AaParsa!(最短路+思维建图)
- SPOJ - SUBLEX Lexicographical Substring Search(后缀自动机)
- Pollard_rho算法+Miller_Rabin算法(大素数的判断与素因子分解)(模板)
- 中石油训练赛 - 小说(最短路+二分)
- wpsppt如何虚化图片_PPT模仿之路——图片以及笔画的虚化
- java获取oracle表空间_Oracle 表空间使用情况查询与修改
- 练习7-11 字符串逆序 (15分)
- C++ STL : 模拟实现STL中的容器适配器stack和queue
- Netty学习笔记(四)EventLoopGroup续篇
- Go 应用性能优化指北