搭建分布式架构,把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. 开发服务消费者

(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";
            }
        };
    }
}

  1. 业务层接口

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);
    }
}

  1. 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

  1. 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技术,开发服务消费者相关推荐

  1. 搭建分布式架构4--ZooKeeper注册中心安装

    2019独角兽企业重金招聘Python工程师标准>>> ZooKeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务--分布式同步(Distr ...

  2. 万字长文解析:分布式架构、SOA、微服务架构、API网关、ESB服务总线架构之间的关联及演进

    1架构演进 架构十五年:改变的是形态,不变的是目的 业务驱动架构形态变化 过去十几年,随着互联网发展以及业务的多样化,系统的架构也在不断发生变化,总体上来说大体经历了从单体应用架构-垂直应用架构-分布 ...

  3. java简单搭建分布式架构

    一般来说,数据库的数据过多,查询效率就很慢,这时候我们如果把表分库到不同的数据库,这时候访问速度就会快很多,如果并且采用多线程去访问的话,查询速度也会提高的更快,我这里是运行内存8核电脑进行测试的单个 ...

  4. 一文看懂Java微服务架构,WEB2.0,垂直架构,分布式架构,微服务架构

    Java微服务架构 目录: 了解开发环境&生成环境 WEB1.0 & WEB2.0 垂直架构 分布式架构 微服务架构 1.了解开发环境&生产环境 1.1 开发环境 平时在写代码 ...

  5. 基于Licode的WebRTC全球分布式架构

    随着在线教育行业的兴起, 许多人把目光投向了国外市场,而如何搭建全球化的音视频网络就成为了其中的关键问题.百家云研发工程师陈聪详细介绍了如何利用Licode 开源服务器搭建全球分布式架构以解决常见的教 ...

  6. 微众银行:分布式架构之高可用

    作者:Noe来源:51CTO [51CTO.com原创稿件]导言 在互联网金融快速发展的当下,面对爆发式增长的数据量.高并发海量交易场景,传统集中式架构的性能瓶颈愈发凸显.基于此,越来越多的银行等金融 ...

  7. 广发证券基于分布式架构的新一代估值系统实践

    文 / 广发证券信息技术部 来源 / 金融电子化 随着信息技术应用创新试点范围不断扩大,能否胜任更多业务场景,是各行各业当前阶段选型数据库的关键.早在 2019 年,广发证券即开启对分布式架构的数据库 ...

  8. 分布式架构演变和Dubbo

    分布式架构演变和Dubbo 官方文档 从最初开发的单体应用,到后面的垂直应用架构,随着网络流量大时代的到来,垂直应用架构已无法满足越来越庞大的流量需求,分布式服务架构以及流动计算架构势在必行,亟需一个 ...

  9. 软件架构-从0到1认知分布式架构(上)

    不管之前接触过分布式的没有,有没有分布式的经验,跟着老铁我一起看看熟悉下,绝对收获满满,里面可是有段子啊~ ####(一)分布式发展的历史和背景 场景 一家做政府系统OA系统的公司老板,发现跟竞争对手 ...

最新文章

  1. java gif 帧_在Java中修复动画gif的帧速率
  2. php的异常处理,PHP异常处理Exception类
  3. 哪些情况下索引会失效?
  4. Cookie和Session的区别详解
  5. 适用于ATI卡的GPU计算MD5的小程序源码,基于AMD APP SDK开发
  6. 有用的Copy-On-write,写时复制
  7. hanlp中文分词、提取摘要关键字、语句分析、智能推荐
  8. 面向对象软件设计原则(一) —— 引子
  9. mysql中间件研究(Atlas,cobar,TDDL,Mycat)
  10. DHTML【3】--HTML
  11. 【NumPy基础】100道numpy练习——进阶篇
  12. 51单片机 code关键字
  13. 华为h12m03装系统_华为H22H-03服务器怎么设置从U盘装系统
  14. js模板引擎—art-template的使用
  15. 博客好助手——截图工具Snipaste试用
  16. 计算机f2锁定用户,台式电脑键盘被锁住按什么键恢复 点锁定直接锁定计算机
  17. linux远程取证,linux系统取证
  18. asm MGMT库迁移
  19. iOS开发之应用首次启动显示用户引导 - 疯狂的萝卜 - 博客园
  20. Zookeeper框架Curator使用

热门文章

  1. CodeForces - 1529F It‘s a bird! No, it‘s a plane! No, it‘s AaParsa!(最短路+思维建图)
  2. SPOJ - SUBLEX Lexicographical Substring Search(后缀自动机)
  3. Pollard_rho算法+Miller_Rabin算法(大素数的判断与素因子分解)(模板)
  4. 中石油训练赛 - 小说(最短路+二分)
  5. wpsppt如何虚化图片_PPT模仿之路——图片以及笔画的虚化
  6. java获取oracle表空间_Oracle 表空间使用情况查询与修改
  7. 练习7-11 字符串逆序 (15分)
  8. C++ STL : 模拟实现STL中的容器适配器stack和queue
  9. Netty学习笔记(四)EventLoopGroup续篇
  10. Go 应用性能优化指北