SpringCloud服务的注册与发现(Eureka)

- 服务治理的概念
服务治理是微服务架构中最为核心和基础的模块,主要用来实现各个微服务实列的自动化注册与发现。微服务实例可以是一个简单的SpringBoot程序

- 如何实现服务注册与服务发现
在程序中服务提供方需要显示的将服务注册到注册中心去。在注册登记中心登记在自己提供的服务,主机。端口号,版本号,通信协议等等。注册中心通过服务名进行管理,例如:
这里写图片描述
服务调用方通过服务名发起调用实现,调用方需要向服务注册中心咨询服务,并获取所有服务实例的清单,以实现对具体服务实例的访问,如果有多个服务可以选择的话,采取某种轮询策略(客户端负载平衡)取出一个位置进行调用。在调用服务的时候还会涉及缓存等。
- 服务治理框架的关键
服务治理框架的三大核心,服务调用方、服务提供方、服务注册中心。服务调用方及服务提供方都是围绕服务注册中心展开的

- 搭建服务注册中心
和搭建简单的SpringBoot项目差不多,不过需要在idea中勾选EurekaServer,加载SpringCloud的注册中心的依赖

  • pom.xml:

    <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.7.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <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>Dalston.SR4</spring-cloud.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-web</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>
    
  • EurekaServerApplication启动类

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

    加入了@EnableEurekaServer注解,启动
    一个服务注册中心

  • application.properties配置类

    server.port = 1111
    
    eureka.instance.hostname = localhost
    eureka.client.register-with-eureka = false
    eureka.client.fetch-registry = false
    eureka.client.serviceUrl.defaultZone = http://${eureka.instance.hostname}:${server.port}/eureka
    

    server.port:本地测试的时候为了防止端口被占用改变端口号
    eureka.client.register-with-eureka:代表不向注册中心注册自己,这个服务注册中心是单节点的服务中心,为了满足生产环境,需要使用构建高可用的服务注册中心
    eureka.client.fetch-registry:代表不去检索服务,因为注册中心的主要作用是维护服务器实例
    eureka.client.serviceUrl.defaultZon:注册中心的地址,服务器调用方和服务器提供方向里面请求、注册服务

    完成以后,启动应用,访问http://localhost:1111/
    这里写图片描述
    因为此时没有服务注册中心注册服务,所以Instances currently registered with Eureka这一行内容为空

- 服务提供者

  • pom.xml

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <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>Dalston.SR4</spring-cloud.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-web</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>
    

    和服务注册表的pom.xml类似,只不过将spring-cloud-starter-eureka-service改成了spring-cloud-starter-eureka

  • 启动类

            @EnableDiscoveryClient
            @SpringBootApplication
            public class ServiceproviderApplication {
    
                public static void main(String[] args) {
                    SpringApplication.run(ServiceproviderApplication.class, args);
                }
            }
    @EnableDiscoveryClient注解,激活DiscoveryClient实现
    
     - 控制类
    
    @EnableDiscoveryClient
    @Controller
    public class HelloController {
    
    
        @Value("${server.port}")
        private String port;
        @RequestMapping(value = "/hello", method = RequestMethod.GET)
        @ResponseBody
        public String sayHello() {
    
            return "hello world I'am from " + port;
        }
    }
    

    @EnableDiscoveryClient注解表明自己是一个服务提供方

  • application.properties

    server.port=1112
    
    spring.application.name=hello-service
    eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
    

    spring.application.name:服务名
    eureka.client.serviceUrl.defaultZone:向哪个注册中心注册服务

同时启动服务注册中心和服务提供方,访问http://localhost:1111/http://localhost:1112/hello
前者:
这里写图片描述
多了一个服务
后者将返回helloworld….
这里写图片描述

- 服务调用方

  • pom.xml

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <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>Dalston.SR4</spring-cloud.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</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>
    
    <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>
    

    pom.xml中多了spring-cloud-starter-ribbon

  • 启动类

    @EnableDiscoveryClient
    @SpringBootApplication
    public class ServiceconsumerApplication {
    
        @Bean
        @LoadBalanced
        RestTemplate restTemplate() {
            return new RestTemplate();
        }
    
        public static void main(String[] args) {
            SpringApplication.run(ServiceconsumerApplication.class, args);
        }
    }
    

    @EnableDiscoveryClient:通过该注解让该应用注册为Eureka客户端的应用,以获得服务发现的能力
    @Bean:创建RestTemplate实例,通过它发起对服务的调用
    @LoadBalanced:开启客户端负载平衡

  • 服务调用方控制类:

    @Controller
    public class ConsumerController {
        @Autowired
        private RestTemplate restTemplate;
    
        @RequestMapping(value = "/ribbon-consumer", method = RequestMethod.GET)
        @ResponseBody
        public String helloConsumer() {
            return restTemplate.getForEntity("http://HELLO-SERVICE/hello",String.class).getBody();
        }
    }
    

    这里访问的地址是服务名个,而不是一个具体的地址,通过Ribbon实现负载平衡,选择一个服务地址

  • application.properties

    spring.application.name=ribbon-consumer
    server.port=9000
    eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
    

    此时再次访问http://localhost:1111将会发现有两个当前服务被注册了,访问http://localhost:9000/ribbon-consumer:
    这里写图片描述

完整代码地址:https://github.com/TiantianUpup/SpringCloudEureka

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值