zoukankan      html  css  js  c++  java
  • SpringCloud 学习(二) :服务注册与发现Eureka

    Spring Cloud应用中可以支持多种的服务治理框架,比如Eureka、Consul、Zookeeper等,现在我们用的是consul,本文以SpringCloud Dalston.SR5版本介绍Eureka的使用:

    • 创建服务注册中心
    • 创建服务提供者
    • 创建服务消费者
    • 服务消费
    • 踩的坑

    一、创建服务注册中心

    1.创建一个基础SpringBoot工程,命名为eureka-server

    2.修改pom.xml

    (1)修改一:SpringCloud版本管理

    <!-- 使用dependencyManagement进行版本管理 -->
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Dalston.SR5</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>

    (2)修改二:添加Eureka Server 起步依赖

     <dependency>
          <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-eureka-server</artifactId>
    </dependency>

    (3)完整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">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.6.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.zrk</groupId>
        <artifactId>eureka-server</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>eureka-server</name>
        <description>Eureka Server</description>
    
        <!-- 使用dependencyManagement进行版本管理 -->
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Dalston.SR5</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka-server</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>

    3.修改主启动类

    只需在主启动类上添加@EnableEurekaServer注解就可以启动一个服务注册中心:

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

    官方文档截图

     4.修改配置

    修改配置文件,如application.properties,也可用application.yml(官方文档使用)等:

    spring.application.name=eureka-server
    server.port=8761
    
    eureka.instance.hostname=localhost
    #不把自己注册到注册中心
    eureka.client.register-with-eureka=false
    #不去发现服务
    eureka.client.fetch-registry=false
    #服务注册中心url
    eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka

    启动工程,访问http://localhost:8761

    可以看到Eureka管理页面,看到No instances available,表示还没有实例注册到注册中心。

    注:后续就会发现SpringCloud整合其他框架时都是先导入对应起步依赖,再添加对应注解,再修改配置

    更多详细配置可以参考EurekaInstanceConfigBean.java and EurekaClientConfigBean.java。

    二、创建服务提供者

    1.创建一个基础SpringBoot工程,命名为eureka-provider-user

    2.修改pom.xml

    (1)修改一:SpringCloud版本管理

        <!-- 使用dependencyManagement进行版本管理 -->
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Dalston.SR5</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>


    (2)修改二:添加Eureka起步依赖

       <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-eureka</artifactId>
       </dependency>

    (3)完整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">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.6.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.zrk</groupId>
        <artifactId>eureka-provider-user</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>eureka-provider-user</name>
        <description>Eureka Client</description>
    
        <!-- 使用dependencyManagement进行版本管理 -->
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Dalston.SR5</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>

    3.修改主启动类

     只需在主启动类上添加@EnableEurekaClient注解,也可使用@EnableDiscoveryClient注解,两个注解都能激活Eureka中的DiscoveryClient实现,只是前者仅限于使用Eureka的情况下使用。

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

    4.修改配置

    spring.application.name=provider-user
    server.port=8081
    #设置服务注册中心的URL
    eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

    启动该工程,访问http://localhost:8761

    可以看到provider-user服务已经注册成功!

    5.添加业务逻辑

    (1)UserController.java

    @RestController
    @RequestMapping("user")
    public class UserController
    {
    @RequestMapping(value = "getUserById/{id}")
    public User getUser(@PathVariable Integer id){
    User user = new User();
    user.setId(id);
    user.setName("张三");
    user.setPassword("123");
    return user;
    }
    }

    (2)User.java

    public class User {
        private Integer id;
        private String name;
        private String password;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    }

    三、创建服务消费者

    1.创建一个基础SpringBoot工程,命名为eureka-consumer-basketball

    2.修改pom.xml

    (1)修改同eureka-provider-user,只是多了web相关依赖:

    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>


    (2)完整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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.6.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.zrk</groupId>
    <artifactId>eureka-consumer-basketball</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eureka-consumer-basketball</name>
    <description>Eureka Client</description>

    <properties>
    <java.version>1.8</java.version>
    </properties>

    <!-- 使用dependencyManagement进行版本管理 -->
    <dependencyManagement>
    <dependencies>
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>Dalston.SR5</version>
    <type>pom</type>
    <scope>import</scope>
    </dependency>
    </dependencies>
    </dependencyManagement>

    <dependencies>
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>

    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    </dependency>
    </dependencies>

    <build>
    <plugins>
    <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
    </plugins>
    </build>

    </project>

    3.修改主启动类

     在主启动类上添加@EnableDiscoveryClient注解,并添加RestTemplate组件

    @SpringBootApplication
    @EnableDiscoveryClient
    public class EurekaConsumerBasketballApplication {

    @Bean(name = "restTemplate")
    RestTemplate restTemplate() {
    return new RestTemplate();
    }

    public static void main(String[] args) {
    SpringApplication.run(EurekaConsumerBasketballApplication.class, args);
    }

    }

    4.修改配置

    spring.application.name=consumer-basketball
    server.port=8082
    eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

    5.添加业务逻辑

    (1)BasketballController.java

    @RestController
    public class BasketballController {
    
        @Resource
        private RestTemplate restTemplate;
    
        @RequestMapping(value = "getUser/{id}")
        public User getUserById(@PathVariable Integer id){
            return this.restTemplate.getForObject("http://provider-user/user/getUserById/" + id,User.class);
        }
    }

    (2)User.java

    public class User {
        private Integer id;
        private String name;
        private String password;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    }

    启动该工程,访问http://localhost:8761

    可以看到consumer-basketball服务已经注册成功!

    四、服务消费

    浏览器访问http://localhost:8082/getUser/1

    报了 java.net.UnknownHostException: provider-user异常,发现通过provider-user服务名直接访问不可以,查询后需要加@loadBalance注解才能用服务名访问,调整如下:

    (1)修改一:添加ribbon依赖

    <!-- ribbon ,实现客户端负载均衡-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-ribbon</artifactId>
            </dependency>

    (2)修改二:加@loadBalance

    重启工程,再次访问http://localhost:8082/getUser/1

    访问成功!

    五、踩的坑

    1、网速慢下载maven很慢

      在网速慢的情况下下载maven依赖特别慢,可以通过修改setting.xml解决

      参考链接:https://www.cnblogs.com/zrk3/p/maven_speed_up.html

    2、版本兼容问题

      SpringCloud跟SpringBoot存在版本兼容问题,导致启动报错java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder

         参考链接:https://www.cnblogs.com/zrk3/p/10405989.html

    3、服务名访问问题

      消费者通过生产者服务的服务名进行访问时报 java.net.UnknownHostException异常。

         参考链接:https://blog.csdn.net/qq_18416057/article/details/79432504

  • 相关阅读:
    codevs 2602 最短路径问题x
    codevs 1077 多源最短路x
    2010TianjinRegional 部分题解
    [CF706D]Vasiliy's Multiset(异或字典树)
    [CF710E]Generate a String(DP)
    [CF710C]Magic Odd Square(构造)
    [CF151B]Phone Numbers(暴力,模拟)
    [POJ2104]K-th Number(主席树,静态区间k小)
    [CF707D]Persistent Bookcase(离线,DFS)
    [CF707C]Pythagorean Triples(数学)
  • 原文地址:https://www.cnblogs.com/zrk3/p/springcloud_eureka.html
Copyright © 2011-2022 走看看