当前位置: 首页 > >

Eureka快速入门

发布时间:

一、SpringCloud简介

1.1、概述


? ? ? ?Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems (e.g. configuration management, service discovery, circuit breakers, intelligent routing, micro-proxy, control bus, one-time tokens, global locks, leadership election, distributed sessions, cluster state). Coordination of distributed systems leads to boiler plate patterns, and using Spring Cloud developers can quickly stand up services and applications that implement those patterns. They will work well in any distributed environment, including the developer’s own laptop, bare metal data centres, and managed platforms such as Cloud Foundry.


? ? ? ? Spring Cloud为开发人员提供了快速构建分布式系统中的一些常见模式的工具(例如配置管理、服务发现、熔断器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导层选举、分布式会话、集群状态)。分布式系统的协调导致了锅炉板模式,使用Spring Cloud开发人员可以快速建立实现这些模式的服务和应用程序。它们在任何分布式环境中都能很好地工作,包括开发人员自己的笔记本电脑、裸机数据中心和云计算等托管*台。


1.2、特点


Spring Cloud focuses on providing good out of box experience for typical use cases and extensibility mechanism to cover others.


Distributed/versioned configuration? ?分布式/版本配置

Service registration and discovery? ?服务注册/发现?

Routing? ? 路由

Service-to-service calls? ?服务之间调用

Load balancing? ?负载均衡

Circuit Breakers? ?熔断机制

Global locks? ?全局锁

Leadership election and cluster state? ? 主从选举和集群状况? ??

Distributed messaging? 分布式消息


1.3、Maven创建一个聚合工程,坐标如下,以下项目全部都为模块



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">
4.0.0

cn.waggag.springcloud
SpringCloud_Demo
1.0-SNAPSHOT

user_service
consumer_service
eureka_server

pom

org.springframework.boot
spring-boot-starter-parent
2.1.6.RELEASE



UTF-8
UTF-8
1.8
Greenwich.RELEASE
3.1.0
8.0.16
5.1.9





org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import



tk.mybatis
mapper-spring-boot-starter
2.1.5



mysql
mysql-connector-java
${mysql.version}






org.projectlombok
lombok






org.springframework.boot
spring-boot-maven-plugin




二、服务注册中心 Eureka-Server

2.1、认识Eureka


? ? ? ?Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。Eureka包含两个组件:Eureka Server和Eureka Client。Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器。


2.2、导入依赖



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">

SpringCloud_Demo
cn.waggag.springcloud
1.0-SNAPSHOT

4.0.0

eureka_server
1.0.0-SNAPSHOT



org.springframework.cloud
spring-cloud-starter-netflix-eureka-server




2.3、编写启动类


package cn.waggag;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/**
* @description:
* @author: waggag
* @time: 2019/7/27 17:28
* @Company http://www.waggag.cn
*/
//打开Eureka的服务
@EnableEurekaServer
@SpringBootApplication
public class EurekaServer {

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

}

2.4、启动Eureka,正常访问Eurkea的服务界面



?2.5、控制台报错解决


com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112) ~[eureka-client-1.9.8.jar:1.9.8]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56) ~[eureka-client-1.9.8.jar:1.9.8]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59) ~[eureka-client-1.9.8.jar:1.9.8]
at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77) ~[eureka-client-1.9.8.jar:1.9.8]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56) ~[eureka-client-1.9.8.jar:1.9.8]
at com.netflix.discovery.DiscoveryClient.register(DiscoveryClient.java:829) ~[eureka-client-1.9.8.jar:1.9.8]
at com.netflix.discovery.InstanceInfoReplicator.run(InstanceInfoReplicator.java:121) ~[eureka-client-1.9.8.jar:1.9.8]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_221]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_221]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_221]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1.8.0_221]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_221]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_221]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_221]

2.6、配置文件添加以下配置


server:
port: 8082
#配置服务的名字
spring:
application:
name: eureka_server
#自己注册自己
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8082/eureka

2.7、服务注册方


添加依赖:




org.springframework.cloud
spring-cloud-starter-netflix-eureka-client

在user-service中添加注解


package cn.waggag;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import tk.mybatis.spring.annotation.MapperScan;

/**
* @description:
* @author: waggag
* @time: 2019/7/27 9:47
* @Company http://www.waggag.cn
*/
@EnableDiscoveryClient
@SpringBootApplication
@MapperScan("cn.waggag.mapper")
public class UserApplication {

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

? ? ? ?@EnableDiscoveryClient和@EnableEurekaClient


? ? ? ?共同点:都是能够让注册中心能够发现,扫描到该服务。


? ? ? ?不同点:@EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient?可以是其他注册中心。
添加配置


server:
port: 8081
spring:
datasource:
url: jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC
username: waggag
password: 225514
hikari:
maximum-pool-size: 20
minimum-idle: 10
application:
name: user_service
mybatis:
type-aliases-package: cn.waggag.domain
eureka:
client:
service-url: http://127.0.0.1:8082/eureka/

2.8、服务消费方


添加依赖:




org.springframework.cloud
spring-cloud-starter-netflix-eureka-client

添加注解:


package cn.waggag;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

/**
* @description:
* @author: waggag
* @time: 2019/7/27 10:05
* @Company http://www.waggag.cn
*/
@EnableDiscoveryClient
@SpringBootApplication
public class ConsumerApplication {

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

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

配置文件进行配置:


server:
port: 8080
spring:
application:
name: consumer_service
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8082/eureka

动态获取需要的服务:


package cn.waggag.controller;

import cn.waggag.domain.User;
import com.netflix.appinfo.InstanceInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

/**
* @description:
* @author: waggag
* @time: 2019/7/27 10:08
* @Company http://www.waggag.cn
*/
@RestController
@RequestMapping("consumer")
public class ConsumerController {

@Autowired
private RestTemplate restTemplate;

@Autowired
private DiscoveryClient discoveryClient;

@GetMapping("{id}")
public User queryById(@PathVariable("id")int id){
//根据服务ID获取实例
List userService = discoveryClient.getInstances("user_service");
//从实例中取出IP和端口
ServiceInstance instance = userService.get(0);
String host = instance.getHost();
int port = instance.getPort();

String url = "http://"+host+":"+port+"/user/"+id;
User user = restTemplate.getForObject(url, User.class);
return user;
}
}

三、Eureka详解


3.1、基础架构


Eureka架构中的三个核心角色:


服务注册中心

? ? ? ? ? ? Eureka的服务端应用,提供服务注册和发现功能,就是刚刚我们建立的eureka-demo


服务提供者

? ? ? ? ? ? 提供服务的应用,可以是SpringBoot应用,也可以是其它任意技术实现,只要对外提供的是Rest风格服务即可。


服务消费者

? ? ? ? ? ? 消费应用从注册中心获取服务列表,从而得知每个服务方的信息,知道去哪里调用服务方。




友情链接: