SpringCloud微服务(一)Eureka

162 阅读3分钟

Eureka 服务治理中心

  • 服务中心三大核心: 服务注册中心,服务提供者,服务消费者;
  • 服务提供者大多时候也是服务消费者;
  • 服务消费者采用Ribbon方式消费。

注册中心:

  • 启动类上,@EnableEurekaServer注解使改服务成为注册中心;
@EnableEurekaServer
@SpringBootApplication
public class ServerApplication { 
        public static void main(String[] args) {        
                SpringApplication.run(ServerApplication.class, args);   
        }
}
  • 注册中心只需提供一个场所,不需要检测服务以及注册自己(在Eureka中这两点是默认true的);
eureka.client.register-with-eureka=false
eureka.client.fetch-register=false
  • 配置application.properties文件中引入:
#服务注册中心
server.port=2222
#eureka
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/
# 关闭自我保护机制
eureka.server.enable-self-preservation=false
  • 至此Eureka服务端完成,启动访问http://localhost:2222可看到此页面,此时没有服务提供者,就没有实例服务的状态;
    启动后的服务端

服务提供者

  • 服务提供者需要提供服务注册到注册中心中,同时也能检索到其他服务;在配置文件中配置相对简单;只需要对服务进行命名以及告诉提供者注册中心地址即可;如果要用ip的形式,需要加入配置参数eureka.instance.prefer-ip-address=true,
  • 加入eureka.instance.lease-renewal-interval-in-seconds=30目的是为了向注册中心提供一个心跳,来告诉注册中心服务还“活着”,从而不剔除起服务实例,参数默认值为30;
  • eureka.instance.lease-expiration-duration-in-seconds=90,作用是在服务无反应90s后,注册中心剔除服务,此参数默认值为90;
  • 配置application.properties文件中引入:
server.port=8090
#服务名
spring.application.name=hello-service
#服务中心地址
eureka.client.serviceUrl.defaultZone=http://localhost:2222/eureka/
#服务续约
#服务续约任务的调用时间间隔
eureka.instance.lease-renewal-interval-in-seconds=30
#服务失效时间(90s无响应则剔除服务)
eureka.instance.lease-expiration-duration-in-seconds=90

  • 启动类上加上注解@EnableDiscoveryClient,使其能够被发现;
@EnableDiscoveryClient
@SpringBootApplication
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}
  • 新建一个controller提供给消费者访问:
@RestController
@RequestMapping("/access")
public class AccessController {
    private static final Logger logger = LoggerFactory.getLogger(AccessController.class);

    @Autowired
    private DiscoveryClient client;

    @RequestMapping("/hello")
    public String index(){

        ServiceInstance instance = client.getLocalServiceInstance();

        logger.info("hello, host:+"+instance.getHost() + ", service_id:"+ instance.getServiceId());

        return "Hello world";
    }
}
  • 启动程序访问注册中心http://localhost:2222/eureka即可看到该实例的信息:
    在这里插入图片描述

服务消费者

  • 服务提供者大多数也是服务消费者,在配置上与提供者一致;
  • 服务消费者采用Ribbon的方式消费服务,Ribbon是一种客户端负载均衡器;
  • 配置application.properties文件中引入:
#服务消费者
server.port=9000
#服务名
spring.application.name=consumer-service
#服务中心地址
eureka.client.serviceUrl.defaultZone=http://localhost:2222/eureka/
#服务续约
#服务续约任务的调用时间间隔
eureka.instance.lease-renewal-interval-in-seconds=30
#服务失效时间(90s无响应则剔除服务)
eureka.instance.lease-expiration-duration-in-seconds=90
  • 在启动类上加上一个@LoadBalance注解,以及注入@Bean,采用RestTemplate来调用;
@EnableDiscoveryClient
@SpringBootApplication
public class ConsumerApplication {

    @Bean
    @LoadBalanced
    RestTemplate restTemplate(){
        return new RestTemplate();
    }

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

}
  • 在消费者中新建一个controller来对提供者的接口进行调用;
@RestController
@RequestMapping(value = "/consumer")
public class ConsumerController {

    @Autowired
    RestTemplate restTemplate;


    @RequestMapping(value = "/robbin")
    public String helloConsumer(){
        return restTemplate.getForEntity("http://HELLO-SERVICE/access/hello",String.class).getBody();
    }
}
  • 服务治理的重点就是服务,所以调用是直接用的是HELLO-SERVICE服务进行调用;访问消费者的接口,在提供者的日志中看得到如下图:
    在这里插入图片描述