springcloud应用之eureka

springcloud应用之eureka

项目下载

单体eureka项目
eureka集群项目

eureka简介

eureka是Netflix的子模块之一,也是一个核心的模块
Eureka 采用了 C-S 的设计架构。Eureka Server 作为服务注册功能的服务器,它是服务注册中心。
而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行

eureka单机

单机项目结构图,我的想法是把order8000,order8001和user8100都注册到注册中心,然后user微服务负载均衡调用order微服务
在这里插入图片描述

服务端

新建一个springcloud maven项目,然后右键springcloud, new module选择spring initializr,下一步然后填写Group,ArtifactId之后搜索eureka选择Eureka Server,会到Selected Dependencies里点击next即可
在这里插入图片描述这样他会自动帮你加上如下

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

resources里加上application.yml文件

spring:
  application:
    name: eureka-server
server:
  port: 7000
eureka:
  server:
    #enable-self-preservation: false  #关闭自我保护机制
    eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位:毫秒 默认是60*1000)
  instance:
    hostname: localhost


  client:
    #单机情况下面两个是改成false,集群注释掉即可
    registerWithEureka: false #不把自己作为一个客户端注册到自己身上
    fetchRegistry: false  #不需要从服务端获取注册信息(因为在这里自己就是服务端,而且已经禁用自己注册了)
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka

接下来只需要在他帮你自动生成的启动类加上@EnableEurekaServer,运行即可,访问localhost:7000出现网页证明配置正确

客户端

右键springcloud, new module选择spring initializr,下一步然后填写Group,ArtifactId之后搜索eureka选择Eureka Discover client,会到Selected Dependencies里点击next即可
pom文件增加
为什么服务端不用加boot依赖?是因为spring-cloud-starter-netflix-eureka-server里已经依赖了boot

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

application.yml

spring:
  application:
    name: order #此实例注册到eureka服务端的name
server:
  port: 8000

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:7000/eureka/  #eureka服务端提供的注册地址 参考服务端配置的这个路径
  instance:
    instance-id: order-1 #此实例注册到eureka服务端的唯一的实例ID
    prefer-ip-address: true #是否显示IP地址
    leaseRenewalIntervalInSeconds: 10 #eureka客户需要多长时间发送心跳给eureka服务器,表明它仍然活着,默认为30 秒 (与下面配置的单位都是秒)
    leaseExpirationDurationInSeconds: 30 #Eureka服务器在接收到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除,默认为90秒

接下来只需要在他帮你自动生成的启动类加上@EnableEurekaClient
order微服务和user微服务都这样搭建好,访问localhost:7000出现下图:
在这里插入图片描述

扫描二维码关注公众号,回复: 10747186 查看本文章

微服务调用

我们先来看看最最普通的调用方式
我们先order模块

@RestController
public class OrderController {

    @RequestMapping("order")
    public String order(){
        return "order find";
    }
}

再user模块

@Configuration
public class AppConfig {
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}
@RestController
public class UserController {

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("queryOrder")
    public String queryOrder(){
    	//这种方式访问就失去了注册中心的意义
        ResponseEntity<String> response = restTemplate.getForEntity("http://localhost:8000/order",String.class);
        return response.getBody();
    }
}

负载均衡的调用方式

	@Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
    
//注意url  http://order/order的第一个order是order模块的application.name的名字
//而且这种方式端口都不用写,因为ribbon帮我们做了客户端的负载均衡
ResponseEntity<String> response = restTemplate.getForEntity("http://order/order",String.class);

注意负载均衡时ribbon实现的,但是我们并没有加入ribbon依赖,这是因为eureka-client依赖了ribbon
在这里插入图片描述

我们可以再建一个order8001微服务,把order8000的文件都copy过来,yml文件instance-id改成这样
instance-id: order-2,server:port: 8001,注意同一组微服务客户端的application.name必须一致,例如order8000和order8001的微服务名字都是order。还可以适当修改8001 controller的内容以观察负载均衡结果

eureka集群

上面例子中我们的注册中心只有一个,万一挂了整个项目就完了,所以必须对注册中心做集群,说到这顺便再说一句eureka的注册中心只要还有一个都可以正常工作,而zookeeper是有过半机制的,这是二者的区别之一。

服务端

我们现在只有eureka-server-7000一台注册中心,我们再加两台,7001和7002,
首先修改hosts文件,路径为C:\Windows\System32\drivers\etc,添加如下三行
127.0.0.1 server7000
127.0.0.1 server7001
127.0.0.1 server7002
然后用上面新建eureka-server的办法建立eureka-server-7001和eureka-server-7002,加好注解@EnableEurekaSever
7000的yml

spring:
  application:
    name: eureka-server
server:
  port: 7000
eureka:
  server:
    eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位:毫秒 默认是60*1000)
  instance:
    hostname: server7000
  client:
    serviceUrl:
      defaultZone: http://server7001:7001/eureka,http://server7002:7002/eureka

7001的yml

spring:
  application:
    name: eureka-server
server:
  port: 7001
eureka:
  server:
    eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位:毫秒 默认是60*1000)
  instance:
    hostname: server7001
  client:
    serviceUrl:
      defaultZone: http://server7000:7000/eureka,http://server7002:7002/eureka

7002的yml

spring:
  application:
    name: eureka-server
server:
  port: 7002
eureka:
  server:
    eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位:毫秒 默认是60*1000)
  instance:
    hostname: server7002
  client:
    serviceUrl:
      defaultZone: http://server7000:7000/eureka,http://server7001:7001/eureka

客户端

所有客户端的defaultZone改成这样

defaultZone: http://server7000:7000/eureka,http://server7001:7001/eureka,http://server7002:7002/eureka

先启动三个server,再启动三个client,访问localhost:7000出现下图证明集群搭建正确
在这里插入图片描述访问localhost:8100/queryOrder负载均衡的访问order8000和order8001微服务

发布了164 篇原创文章 · 获赞 81 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/LiuRenyou/article/details/104757532