• SpringCloud学习(二)---Eureka


    Eureka

    重点在使用,概念和源码基本不涉及

    Eureka是一个基于REST(REST是HTTP协议的)的服务,主要在亚马逊网络服务(AWS)云中使用,定位服务来进行中间层服务器的均衡负载和故障转移.

    Spring Cloud封装Eureka来实现服务注册和发现,Eureka采用了C-S的设计架构,Eureka Server作为服务注册功能的服务器,是服务注册中心,系统中的其他微服务都是Eureka Client,连接到Eureka Server,并维持心跳连接.这样就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。

    Eureka由两个组件组成: Eureka Server和Eureka Client. Eureka Server用作服务注册服务器.Eureka Client就是Java客户端,分为两种,一种是Service Provider,一种是Service Consume,但是两者不是严格的概念区分,也就是说一个Service Consume也可以是Service Provider,看实际的场景.

    也就是Eureka Server提供服务的注册和发现

    Service Provider将自身服务注册到Eureka Server,并保持心跳续约等

    Service Consumer从Eureka Server获取注册列表,进行服务消费,也就是通过远程调用与Service Provider进行通信.

    搭建Eureka Server

    1. 创建项目,引入依赖
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    
    1. 启动类添加注解
    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaServerSmileApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(EurekaServerSmileApplication.class, args);
        }
    
    }
    
    1. 配置文件
    spring:
      application:
        name: spring-cloud-eureka-server
    server:
      port: 8761
    eureka:
      client:
        # 是否注册自己
        register-with-eureka: false
        # 是否从Eureka Server获取注册信息
        fetch-registry: false
        # 设置与Eureka Server交互的地址,多个地址使用逗号合开,也就是集群
        service-url:
          default-zone: http://localhost:${server.port}/eureka/
    
    1. 启动项目,直接访问http://localhost:8761/就可以看到Eureka Server的主界面,这个时候No instances available.

    集群的搭建(3个)

    1. 创建项目添加依赖(同上)
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    
    1. 启动类添加注解(同上)
    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaServerSmileJqApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(EurekaServerSmileJqApplication.class, args);
        }
    
    }
    
    1. 配置文件,三个配置文件,第一个个application-master.properties:
    server.port=8761
    eureka.instance.hostname=master
    eureka.client.serviceUrl.defaultZone=http://slave1:8762/eureka/,http://slave2:8763/eureka/
    spring.application.name=eureka-server
    eureka.client.register-with-eureka=true
    eureka.client.fetch-registry=true
    

    第二个application-slave1.properties

    server.port=8762
    eureka.instance.hostname=slave1
    eureka.client.serviceUrl.defaultZone=http://master:8761/eureka/,http://slave2:8763/eureka/
    spring.application.name=eureka-server
    eureka.client.register-with-eureka=true
    eureka.client.fetch-registry=true
    

    application-slave2.properties

    server.port=8763
    eureka.instance.hostname=slave2
    eureka.client.serviceUrl.defaultZone=http://master:8761/eureka/,http://slave1:8762/eureka/
    spring.application.name=eureka-server
    eureka.client.register-with-eureka=true
    eureka.client.fetch-registry=true
    

    之后找到本地的hosts文件,推荐使用everything软件,可以搜索全盘,找到hosts文件添加下面内容:

    127.0.0.1 	master
    127.0.0.1 	slave1 
    127.0.0.1 	slave2
    

    进行打包,运行

    mvn clean package
    java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=master
    java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=slave1
    java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=slave2
    

    启动完成后进行访问就可以看到效果,这次进行了注册.

    服务注册与调用实战

    这个就要说到上面的Eureka的三个角色,一个注册中心,一个服务提供者,一个服务消费者,也就是Eureka Server,Service Provider(案例中拼错了,写成producter了,谅解),Service Consumer.中间还还涉及到远程过程调用Feign,这里只需要看一下就好,后面再说这个.

    1. 创建Eureka Service项目,添加依赖,添加注解,修改配置文件如下展示
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    
    
    @SpringBootApplication
    @EnableEurekaServer
    public class ServerSmileDemoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ServerSmileDemoApplication.class, args);
        }
    
    }
    
    
    server.port=8761
    spring.application.name=eureka-server
    eureka.client.register-with-eureka=false
    eureka.client.fetch-registry=false
    eureka.client.service-url.defaultZone=http://localhost:${server.port}/eureka/
    
    
    
    1. 创建提供者,依次依赖,注解,配置文件,最后写个controller
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    
    
    @SpringBootApplication
    @EnableDiscoveryClient
    public class ServiceProducterDemoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ServiceProducterDemoApplication.class, args);
        }
    
    }
    
    
    server.port=9000
    spring.application.name=eureka-service-producter
    eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
    
    
    @RestController
    public class HelloController {
    
        /** 看的博客上出现了Request method ‘POST’ not supported问题,因为没有添加@RequestParam注解,说是不添加那个注解就是post请求,就算是用GetMapping指定了还是POST请求,这个本人没有测试 */
        @GetMapping("hello")
        public String hello(@RequestParam String name){
            return "hello," + name + "1111111";
        }
    
    }
    
    1. 创建消费者,添加依赖(这个需要添加feign的依赖),后面依次
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    
    @SpringBootApplication
    @EnableDiscoveryClient
    @EnableFeignClients
    public class ServiceConsumerDemoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ServiceConsumerDemoApplication.class, args);
        }
    
    }
    
    server.port=9010
    spring.application.name=eureka-service-consumer
    eureka.client.service-url.defaultZone=http://localhost:8761/eureka
    
    
    @RestController
    public class ConsumerController {
    
        @Autowired
        private HelloRemote helloRemote;
    
        @GetMapping("/hello/{name}")
        public String hello(@PathVariable("name") String name){
            return helloRemote.hello(name);
        }
    }
    

    上面按照顺序启动,先启动注册中心,然后启动提供者,最后启动消费者,访问的时候访问消费者的hello,就可以访问到提供者的hello了.

    负载均衡

    feign有负载均衡的作用(feign是基于Ribbon实现的,所以自带客户端负载均衡功能),在上面的基础之上,再次创建个提供者,与上面提供者不同的是端口号和controller稍微变下,具体代码如下:

     <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    
    server.port=9001
    spring.application.name=eureka-service-producter
    eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
    
    @SpringBootApplication
    @EnableDiscoveryClient
    public class ServiceProducterDemo1Application {
    
        public static void main(String[] args) {
            SpringApplication.run(ServiceProducterDemo1Application.class, args);
        }
    
    }
    
    
    @RestController
    public class HelloController {
    
        @GetMapping("hello")
        public String hello(@RequestParam String name){
            return "hello," + name + "222222";
        }
    }
    
    
    

    之后同时启动四个项目,看注册中心就能看到EUREKA-SERVICE-PRODUCTER后有两个服务,之后访问http://localhost:9010/hello/wangzhi就可以看到hello,wangzhi1111111和hello,wangzhi222222交替出现,这个就是负载均衡了.

    到这Eureka基本就结束了我没有看源码,这个说明下,还有人说Eureka闭源了,其实并不是,只是不继续开发2.X版本,1.X版本还在更新维护呢.而且现在阿里开源了Nacos,这个也是可以替代Eureka的,所以说替代方案还是有的.

  • 相关阅读:
    前端攻城狮学习笔记九:让你彻底弄清offset
    JavaScript中Element与Node的区别,children与childNodes的区别
    JavaScript代码优化实战之一:缓存变量,关键字过滤
    【转】纯CSS画的基本图形(矩形、圆形、三角形、多边形、爱心、八卦等),NB么
    包装对象——JavaScript中原始类型拥有属性的原因
    关于两个容积不同的瓶子中装水可以得到哪些精确值的问题的算法
    JavaScript中判断鼠标按键(event.button)
    累了休息一会儿吧——分享一个JavaScript版扫雷游戏
    用CSS让未知高度内容垂直方向居中
    空间换时间,把递归的时间复杂度降低到O(2n)
  • 原文地址:https://www.cnblogs.com/wadmwz/p/10522210.html
Copyright © 2020-2023  润新知