Eureka

重点在使用,概念和源码基本不涉及

Eureka是一个基于REST(REST是HTTP协议的)的服务,主要在亚马逊网络服务(AWS)云中使用,定位服务来进行中间层服务器的均衡负载和故障转移.

Spring Cloud封装Eureka来实现服务注册和发现,Eureka采用了C-S的设计架构,Eureka Server作为服务注册功能的服务器,是服务注册中心,系统中的其他微服务都是Eureka Client,连接到Eureka Server,并维持心跳连接.这样就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。

Eureka由两个组件组成: Eureka Server和Eureka Client. Eureka Server用作服务注册服务器.Eureka Client就是Java客户端,分为两种,一种是Service Provider,一种是Service Consume,但是两者不是严格的概念区分,也就是说一个Service Consume也可以是Service Provider,看实际的场景.

也就是Eureka Server提供服务的注册和发现

Service Provider将自身服务注册到Eureka Server,并保持心跳续约等

Service Consumer从Eureka Server获取注册列表,进行服务消费,也就是通过远程调用与Service Provider进行通信.

搭建Eureka Server

  1. 创建项目,引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
  1. 启动类添加注解
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerSmileApplication { public static void main(String[] args) {
SpringApplication.run(EurekaServerSmileApplication.class, args);
} }
  1. 配置文件
spring:
application:
name: spring-cloud-eureka-server
server:
port: 8761
eureka:
client:
# 是否注册自己
register-with-eureka: false
# 是否从Eureka Server获取注册信息
fetch-registry: false
# 设置与Eureka Server交互的地址,多个地址使用逗号合开,也就是集群
service-url:
default-zone: http://localhost:${server.port}/eureka/
  1. 启动项目,直接访问http://localhost:8761/就可以看到Eureka Server的主界面,这个时候No instances available.

集群的搭建(3个)

  1. 创建项目添加依赖(同上)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
  1. 启动类添加注解(同上)
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerSmileJqApplication { public static void main(String[] args) {
SpringApplication.run(EurekaServerSmileJqApplication.class, args);
} }
  1. 配置文件,三个配置文件,第一个个application-master.properties:
server.port=8761
eureka.instance.hostname=master
eureka.client.serviceUrl.defaultZone=http://slave1:8762/eureka/,http://slave2:8763/eureka/
spring.application.name=eureka-server
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true

第二个application-slave1.properties

server.port=8762
eureka.instance.hostname=slave1
eureka.client.serviceUrl.defaultZone=http://master:8761/eureka/,http://slave2:8763/eureka/
spring.application.name=eureka-server
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true

application-slave2.properties

server.port=8763
eureka.instance.hostname=slave2
eureka.client.serviceUrl.defaultZone=http://master:8761/eureka/,http://slave1:8762/eureka/
spring.application.name=eureka-server
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true

之后找到本地的hosts文件,推荐使用everything软件,可以搜索全盘,找到hosts文件添加下面内容:

127.0.0.1 	master
127.0.0.1 slave1
127.0.0.1 slave2

进行打包,运行

mvn clean package
java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=master
java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=slave1
java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=slave2

启动完成后进行访问就可以看到效果,这次进行了注册.

服务注册与调用实战

这个就要说到上面的Eureka的三个角色,一个注册中心,一个服务提供者,一个服务消费者,也就是Eureka Server,Service Provider(案例中拼错了,写成producter了,谅解),Service Consumer.中间还还涉及到远程过程调用Feign,这里只需要看一下就好,后面再说这个.

  1. 创建Eureka Service项目,添加依赖,添加注解,修改配置文件如下展示
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency> @SpringBootApplication
@EnableEurekaServer
public class ServerSmileDemoApplication { public static void main(String[] args) {
SpringApplication.run(ServerSmileDemoApplication.class, args);
} } server.port=8761
spring.application.name=eureka-server
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://localhost:${server.port}/eureka/
  1. 创建提供者,依次依赖,注解,配置文件,最后写个controller
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency> @SpringBootApplication
@EnableDiscoveryClient
public class ServiceProducterDemoApplication { public static void main(String[] args) {
SpringApplication.run(ServiceProducterDemoApplication.class, args);
} } server.port=9000
spring.application.name=eureka-service-producter
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/ @RestController
public class HelloController { /** 看的博客上出现了Request method ‘POST’ not supported问题,因为没有添加@RequestParam注解,说是不添加那个注解就是post请求,就算是用GetMapping指定了还是POST请求,这个本人没有测试 */
@GetMapping("hello")
public String hello(@RequestParam String name){
return "hello," + name + "1111111";
} }
  1. 创建消费者,添加依赖(这个需要添加feign的依赖),后面依次
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency> @SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ServiceConsumerDemoApplication { public static void main(String[] args) {
SpringApplication.run(ServiceConsumerDemoApplication.class, args);
} } server.port=9010
spring.application.name=eureka-service-consumer
eureka.client.service-url.defaultZone=http://localhost:8761/eureka @RestController
public class ConsumerController { @Autowired
private HelloRemote helloRemote; @GetMapping("/hello/{name}")
public String hello(@PathVariable("name") String name){
return helloRemote.hello(name);
}
}

上面按照顺序启动,先启动注册中心,然后启动提供者,最后启动消费者,访问的时候访问消费者的hello,就可以访问到提供者的hello了.

负载均衡

feign有负载均衡的作用(feign是基于Ribbon实现的,所以自带客户端负载均衡功能),在上面的基础之上,再次创建个提供者,与上面提供者不同的是端口号和controller稍微变下,具体代码如下:

 <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency> server.port=9001
spring.application.name=eureka-service-producter
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/ @SpringBootApplication
@EnableDiscoveryClient
public class ServiceProducterDemo1Application { public static void main(String[] args) {
SpringApplication.run(ServiceProducterDemo1Application.class, args);
} } @RestController
public class HelloController { @GetMapping("hello")
public String hello(@RequestParam String name){
return "hello," + name + "222222";
}
}

之后同时启动四个项目,看注册中心就能看到EUREKA-SERVICE-PRODUCTER后有两个服务,之后访问http://localhost:9010/hello/wangzhi就可以看到hello,wangzhi1111111和hello,wangzhi222222交替出现,这个就是负载均衡了.

到这Eureka基本就结束了我没有看源码,这个说明下,还有人说Eureka闭源了,其实并不是,只是不继续开发2.X版本,1.X版本还在更新维护呢.而且现在阿里开源了Nacos,这个也是可以替代Eureka的,所以说替代方案还是有的.

最新文章

  1. Container View 使用小技巧
  2. 【CentOS】压缩打包
  3. Filter的用法之注解
  4. 【WPF】无边框窗体
  5. 2.设计包含 min 函数的栈[StackWithMinValue]
  6. JedisPool连接池实现难点
  7. C &amp;&amp; C++ 内存分配示意图
  8. 关联 Android 源代码 到 Ecplise
  9. Oracle ORA-00119和ORA-00132的解决方案
  10. 【暑假】[深入动态规划]UVa 1628 Pizza Delivery
  11. Android Bitmaps缓存
  12. tiny4412学习笔记-将uboot、zImage、文件系统烧到emmc中
  13. [Android学习笔记]使用ListView
  14. java代码 分解EXCEL(一)
  15. 商城项目实战 | 2.1 Android 仿京东商城——自定义 Toolbar (一)
  16. jQuery之stop()
  17. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table &#39;portal.hibernate_sequence&#39; doesn&#39;t exist, 谈谈主键自增的方式
  18. markdown最基本的几种语法
  19. java新知识系列 五
  20. C# [Win32] [API] WS_TABSTOP 無效的解決辦法

热门文章

  1. 校内模拟赛 虫洞(by NiroBC)
  2. JDK8漫谈——增强接口
  3. MRT与MRTS工具官宣退休,推荐使用HEG
  4. Mysql之binlog日志说明及利用binlog日志恢复数据操作记录
  5. Linux内核第二节
  6. 2017[BUAA软工]第0次个人作业
  7. Linux下Vim使用备忘
  8. Bash on Ubuntu on Windows 到底想干啥?apt update又能解决啥问题?
  9. Mysql 5.7.21 单机多实例安装
  10. modern effective C++ -- Deducint Types