• Spring-Cloud-Eureka实例


    SpringCloud实现服务注册中心

    注册中心这么关键的服务,如果是单点话,遇到故障就是毁灭性的。在一个分布式系统中,服务注册中心是最重要的基础部分,理应随时处于可以提供服务的状态。为了维持其可用性,使用集群是很好的解决方案。Eureka通过互相注册的方式来实现高可用的部署,所以我们只需要将Eureke Server配置其他可用的serviceUrl就能实现高可用部署。

    实例结构如下图所示,服务中心双机部署(模仿集群)。

    双节点注册中心

    1、创建application-peer1.properties,作为peer1服务中心的配置,并将serviceUrl指向peer2

    spring.application.name=spring-cloud-eureka
    server.port=8000
    eureka.instance.hostname=peer1
    
    eureka.client.serviceUrl.defaultZone=http://peer2:8001/eureka/
    

      

    2、创建application-peer2.properties,作为peer2服务中心的配置,并将serviceUrl指向peer1

    spring.application.name=spring-cloud-eureka
    server.port=8001
    eureka.instance.hostname=peer2
    
    eureka.client.serviceUrl.defaultZone=http://peer1:8000/eureka/
    

      

    3、host转换

    在hosts文件中加入如下配置

    127.0.0.1 peer1  
    127.0.0.1 peer2  
    

      

    4、打包启动

    依次执行下面命令

    #打包
    mvn clean package
    # 分别以peer1和peeer2 配置信息启动eureka
    java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
    java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2
    

      依次启动完成后,浏览器输入:http://localhost:8000/ 效果图如下:

    根据图可以看出peer1的注册中心DS Replicas已经有了peer2的相关配置信息,并且出现在available-replicas中。我们手动停止peer2来观察,发现peer2就会移动到unavailable-replicas一栏中,表示peer2不可用。

    到此双节点的配置已经完成。

    服务生产方

    spring-cloud-producer

    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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.2.0.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.ln</groupId>
        <artifactId>spring-cloud-producer</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>spring-cloud-producer</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
            <spring-cloud.version>Hoxton.M3</spring-cloud.version>
        </properties>
    
        <dependencies>
            <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>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring-cloud.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
        <repositories>
            <repository>
                <id>spring-milestones</id>
                <name>Spring Milestones</name>
                <url>https://repo.spring.io/milestone</url>
            </repository>
        </repositories>
    
    </project>
    

      

    application.properties

    spring.application.name=spring-cloud-producer
    server.port=9000
    eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
    

    启动类

    package com.ln.springcloudproducer;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    
    @SpringBootApplication
    @EnableDiscoveryClient //启动类增加EnableDiscoveryClient注解,项目就具有了服务注册的功能
    public class SpringCloudProducerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringCloudProducerApplication.class, args);
        }
    
    }
    

    controller

    package com.ln.springcloudproducer.controller;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @author linan
     * @date 2019/10/2311:15
     */
    @RestController
    public class UserController {
    
        @RequestMapping("/hello")
        public String hello(@RequestParam String name){
            return "hello"+name;
        }
    }
    

      

    添加@EnableDiscoveryClient注解后,项目就具有了服务注册的功能。启动工程后,就可以在注册中心的页面看到SPRING-CLOUD-PRODUCER服务。

     

    服务调用方
    spring-cloud-consumer
    application.properties
    spring.application.name=spring-cloud-consumer
    server.port=9001
    eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
    

      


    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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.2.0.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.ln</groupId>
        <artifactId>spring-cloud-consumer</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>spring-cloud-consumer</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
            <spring-cloud.version>Hoxton.M3</spring-cloud.version>
        </properties>
    
        <dependencies>
            <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>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <!--springboot2.2需要引入此包,使用远程调用-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-openfeign-core</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
            
        </dependencies>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring-cloud.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
        <repositories>
            <repository>
                <id>spring-milestones</id>
                <name>Spring Milestones</name>
                <url>https://repo.spring.io/milestone</url>
            </repository>
        </repositories>
    
    </project>
    

    注意:

      <!--springboot2.2需要引入此包,使用远程调用-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-openfeign-core</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>

    启动类
    package com.ln.springcloudconsumer;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    
    @SpringBootApplication
    @EnableDiscoveryClient //启用服务注册与发现
    @EnableFeignClients  //启用feign进行远程调用
    public class SpringCloudConsumerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringCloudConsumerApplication.class, args);
        }
    
    }
    

      

    • @EnableDiscoveryClient :启用服务注册与发现
    • @EnableFeignClients:启用feign进行远程调用
    • Feign是一个声明式Web Service客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。

    feign调用实现

    package com.ln.springcloudconsumer.controller;
    
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    
    /**
     * @author linan
     * @date 2019/10/2314:30
     */
    @FeignClient(name="spring-cloud-producer") //name为远程调用服务名字
    public interface HelloRemote {
        @RequestMapping(value = "/hello")
        public String hello(@RequestParam String name);
    }
    

    controller

    package com.ln.springcloudconsumer.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @author linan
     * @date 2019/10/2314:33
     */
    @RestController
    public class HelloController {
        @Autowired
        HelloRemote helloRemote;
    
        @RequestMapping("/test")
        public String hello(@RequestParam String name){
            return helloRemote.hello(name);
        }
    }
    

      

    测试:

    简单调用

    依次启动spring-cloud-eureka、spring-cloud-producer、spring-cloud-consumer三个项目

    先输入:http://localhost:9000/hello?name=zhagnsan 检查spring-cloud-producer服务是否正常

    返回:hellozhagnsan

    说明spring-cloud-producer正常启动,提供的服务也正常。

    浏览器中输入:http://localhost:9001/test?name=zhagnsan 

    返回:hellozhagnsan

    说明客户端已经成功的通过feign调用了远程服务hello,并且将结果返回到了浏览器。

    参考:https://www.cnblogs.com/ityouknow/p/6859802.html

  • 相关阅读:
    on和where的区别
    分组查询 group by having 排序 order by asc(升序)或desc(降序)
    连接查询 left join on, union
    md5加密方法
    where查询条件的指定,between and,in,like
    Mapnix(转) Anny
    Rolebased access control(RBAC) Anny
    TestComplete如何识别对象(转) Anny
    Jira workflow Anny
    crx文件 Anny
  • 原文地址:https://www.cnblogs.com/e206842/p/11726734.html
Copyright © 2020-2023  润新知