zoukankan      html  css  js  c++  java
  • SpringCloud系列(一):Eureka 服务注册与服务发现

    上一篇,我们介绍了服务注册中心,光有服务注册中心没有用,我们得发服务注册上去,得从它那边获取服务。下面我们注册一个服务到服务注册中心上去。

    我们创建一个 hello-service 的 spring boot 项目,

    POM如下:

    <?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">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.4.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.jp</groupId>
        <artifactId>hello-service</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>hello-service</name>
        <description>Demo project for Spring Boot</description>
        <packaging>jar</packaging>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
            <spring-cloud.version>Finchley.SR1</spring-cloud.version>
        </properties>
    
        <dependencies>
            <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>
        </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>
    </project>

    启动类:

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

    我们这里用的是 @EnableEurekaClient 从名字上就知道,这是一个Eureka客户端.

    我们创建一个controller ,供外部访问

    @RestController
    public class HelloController {
        @RequestMapping("/hello")
        public String hello() throws InterruptedException {
    
            return "this a hello server";
        }
    }

    application.properties 配置内容如下:

    spring.application.name=hello-service
    server.port=9011
    #注册中心地址
    eureka.client.serviceUrl.defaultZone=http://peer1:9001/eureka/,http://peer2:9002/eureka/
    #服务实例元数据,设置实例名,区分同一服务中不同实例的唯一标识
    eureka.instance.instance-id= ${spring.cloud.client.ip-address}:${server.port}
    #启用注册IP
    eureka.instance.prefer-ip-address=true

    这里我们服务中心的地址指定了两个,就是我们之前创建的两个服务注册中心

    我们把之前的两个服务注册中心都启动,再把我们的 hello-service服务也启动,可以看到,我们的hello-service服务也注册上去了。

    下面我们演示服务发现,我们假设有一个 service-a 服务需要调用 hello-service 服务的hello接口,我们以前的做法是 直接 http://localhost:9011/hello  通过地址调用,但是现在我们有服务注册中心,里面有我们的服务,我们通过服务注册中心来调我们的服务

    我们来创建一个 service-a 项目

    POM如下:

    <?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">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.4.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.jp</groupId>
        <artifactId>service-a</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>service-a</name>
        <description>Demo project for Spring Boot</description>
        <packaging>jar</packaging>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
            <spring-cloud.version>Finchley.SR1</spring-cloud.version>
        </properties>
    
        <dependencies>
            <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.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </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>
    </project>

    启动类:

    @SpringBootApplication
    @EnableEurekaClient
    public class ServiceAApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ServiceAApplication.class, args);
        }
    
        /**
         *  LoadBalanced注解是给RestTemplate做标记的,
         *  以使用负载均衡的客户端来(LoadBalancedClient)配置他
         * @return
         */
        @Bean
        @LoadBalanced
        RestTemplate restTemplate(){
            return new RestTemplate();
        }
    }

    这里我们创建了一个 RestTemplate Bean,这玩意就是将你的通信请求简单化,不要你去编写一大堆代码,点击去看下源码就明白了,很好理解,我在controller里面做了简单说明

    我们又在RestTemplate加上了 @LoadBalanced 注解,意思是在RestTemplate请求的时候加上负载均衡,已负载均衡的方式访问服务。

    Controller 类:

    @RestController
    public class ConsumerController {
    
        @Autowired
        RestTemplate restTemplate;
    
        @RequestMapping("/hello")
        public Object hello(){
            /**
             * 这里的请求地址是:
             * 服务实例名/路由地址
             * 可以以 GET,POST,PUT,DELETE的方式请求,对应着获取,提交,修改,删除操作
             */
            return restTemplate.getForEntity("http://hello-service/hello",String.class).getBody();
    
            /**
             * GET 请求
             * 带参数的GET请求,可以传多个参数,下标从1开始
             * 第一个参数是请求地址,第二个是返回类型,第三个是地址里面的参数
             * restTemplate.getForEntity("http://hello-service/user?name={1}",User.class,"jp").getBody();
             * 有三种方式的重载,详见代码
             *
             * 当返回是个对象时,可以这么做
             * User user = restTemplate.getForObject("http://hello-service/user?name={1}",User.class,"jp")
             *
             * POST 请求
             * post请求和get请求大致相同
             *  第一个参数是请求地址,第二个参数是要提交的数据,第三个参数是返回类型
             *  User user = New User("jp",18);
             *  ResponseEntity<String> response = restTemplate.postForEntity("http://hello-service/adduser",user,String.class);
             * String body = response.getBody();
             *
             *  PUT 跟POST 请求一致
             *
             *  DELETE 请求
             *  由于我们通常都是通过唯一标识符去删除数据,基本斗都把参数拼接在url中,所以不需要request数据
             *  delete 请求不需要返回
             *  restTemplate.delete("http://hello-service/user?name={1}","d");
             *
             */
        }
    }

    从代码中我们可以发现,我们调用请求并不是以前我们IP+端口的形式,是 实例名/路由地址 的形式。这样的好处是,可以快速的部署,减少了出问题的可能。

    application.properties 配置内容如下:

    spring.application.name=service-a
    server.port=9021
    #注册中心地址
    eureka.client.serviceUrl.defaultZone=http://peer1:9001/eureka/,http://peer2:9002/eureka/
    #服务实例元数据,设置实例名,区分同一服务中不同实例的唯一标识
    eureka.instance.instance-id= ${spring.cloud.client.ip-address}:${server.port}
    #启用注册IP
    eureka.instance.prefer-ip-address=true

    我们把两个服务注册中心启起来,再把 hello-service 运行,最后把servie-a 运行,然后我们看下服务注册中心都有我们的服务了

     我们调用 service-a 的hello 接口,看会不会返还 hello-service 接口的结果 ,我们打开  http://localhost:9021/hello

     

    看到我们正确的返回了结果,我们到这里服务注册中心和服务注册,服务发现已经演示完毕了

  • 相关阅读:
    domain logic approaches
    远程连接mysql提示:1251-client does not support authentication protocol requested by server
    Navicat远程连接mysql时,报错误“Can't connect to MySQL server on 'ip'(10038)”的解决方法
    XShell连接不了(ubunt14.04)虚拟机Could not connect to ‘192.168.1.105’ (port 22): Connection failed
    Ubuntu20.04 安装和卸载MySQL8
    linux系统(Ubuntu)之合上笔记本盖但不断网
    Ubuntu20.04 FTP服务器的搭建
    Ubuntu20.04安装SqlServer2019教程-简洁版
    Linux更改主机名的三种方法
    ubuntu grub引导win10
  • 原文地址:https://www.cnblogs.com/jpwahaha/p/11074540.html
Copyright © 2011-2022 走看看