Eureka介绍

Spring Cloud Eureka 是对Netflix公司的Eureka的二次封装,它实现了服务治理的功能,Spring Cloud Eureka提供服务端与客户端,服务端即是Eureka服务注册中心,客户端完成微服务向Eureka服务的注册与发现。服务端和客户端均采用Java语言编写

Eureka高可用环境搭建(模拟)

Eureka Server 高可用环境需要部署两个Eureka server,它们互相向对方注册。如果在本机启动两个Eureka需要注意两个Eureka Server的端口要设置不一样,这里我们部署一个Eureka Server工程,将端口可配置,制作两个Eureka Server启动脚本,启动不同的端口。

1、在实际使用时Eureka Server至少部署两台服务器,实现高可用。
2、两台Eureka Server互相注册。
3、微服务需要连接两台Eureka Server注册,当其中一台Eureka死掉也不会影响服务的注册与发现。
4、微服务会定时向Eureka server发送心跳,报告自己的状态。
5、微服务从注册中心获取服务地址以RESTful方式发起远程调用。

工程搭建

pom.xml

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-dependencies</artifactId>
  <version>Dalston.SR3</version>
  <type>pom</type>
  <scope>import</scope>
</dependency>
<!‐‐ 导入Eureka服务的依赖 ‐‐>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring‐cloud‐starter‐netflix‐eureka‐server</artifactId>
</dependency>

Application.yml

server:
  port: ${PORT:50101} #服务端口
spring:
  application:
    name: eureka-test #指定服务名(工程名)
eureka:
  client:
    registerWithEureka: true #服务注册,是否将自己注册到Eureka服务中(单机模式false)
    fetchRegistry: true #服务发现,是否从Eureka中获取注册信息(单机模式false)
    serviceUrl: #Eureka客户端与Eureka服务端的交互地址,高可用状态配置对方的地址,单机状态配置自己(如果不配置则默认本机8761端口)
      defaultZone: ${EUREKA_SERVER:http://eureka02:50102/eureka/}
  server:
    enable-self-preservation: false #是否开启自我保护模式
    eviction-interval-timer-in-ms: 60000 #服务注册表清理间隔(单位毫秒,默认是60*1000)
  instance:
    hostname: ${EUREKA_DOMAIN:eureka01}

Application启动类

@EnableEurekaServer//标识这是一个Eureka服务
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

说明:
两个Eureka互相向对方注册,这里需要通过域名或主机名访问,先在本地host文件中配置eureka01和eureka02域名;
其中配置文件中${PPRT:50101}是为了配置动态端口,具体配置如下:
IDEA:Run->edit configurations
找到Application复制一份在VM options一栏添加:
-DPORT=50101 -DEUREKA_SERVER=http://eureka02:50102/eureka/ -DEUREKA_DOMAIN=eureka01
在复制一份在VM options一栏添加:
-DPORT=50102 -DEUREKA_SERVER=http://eureka01:50101/eureka/ -DEUREKA_DOMAIN=eureka02
这样就可以启动两台服务了,两台服务中心互相注册实现高可用。

配置客户服务

pom.xml

<!‐‐ 导入Eureka客户端的依赖 ‐‐>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

application.yml

eureka:
 client:
   registerWithEureka: true #服务注册开关
   fetchRegistry: true #服务发现开关
   serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址,多个中间用逗号分隔
     defaultZone: ${EUREKA_SERVER:http://localhost:50101/eureka/,http://localhost:50102/eureka/}#写两个避免其中一台挂掉
 instance:
   prefer‐ip‐address: true #将自己的ip地址注册到Eureka服务中
   ip‐address: ${IP_ADDRESS:127.0.0.1}
   instance‐id: ${spring.application.name}:${server.port} #指定实例id

别忘了在启动类上添加注解 @EnableDiscoveryClient ,表示它是一个Eureka的客户端

Feign远程调用

先介绍一下Ribbon
Ribbon是Netflix公司开源的一个负载均衡的项目(https://github.com/Netflix/ribbon),它是一个基于HTTP、TCP的客户端负载均衡器。
它和Nginx不同,Nginx是服务端代理转发,Ribbon是客户端调用。
原理
1、在消费微服务中使用Ribbon实现负载均衡,Ribbon先从EurekaServer中获取服务列表。
2、Ribbon根据负载均衡的算法去调用微服务。
那么Feign又是什么?
Feign是Netflix公司开源的轻量级rest客户端,使用Feign可以非常方便的实现Http 客户端。Spring Cloud引入Feign并且集成了Ribbon实现客户端负载均衡调用。
Feign集成了Ribbon使用起来更加方便
具体使用:
在客户端添加依赖:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring‐cloud‐starter‐openfeign</artifactId>
</dependency>
<dependency>
  <groupId>com.netflix.feign</groupId>
  <artifactId>feign‐okhttp</artifactId>
</dependency>

定义FeignClient接口:(client02_test服务工程略)

@FeignClient(value = client02_test)//远程调用的服务名
public interface client {
  @GetMapping("/user/get/{id}")//GetMapping标识远程调用的类型
  public User findById(@PathVariable("id") String id);
  }
}

启动类添加@EnableFeignClients注解
测试远程调用:

@RunWith(SpringRunner.class)
@SpringBootTest
public class FeignTest {
  @Autowired
  CmsPageClient cmsPageClient;//接口代理对象,由Feign生成代理对象
  @Test
  public void testFeign() {
    //通过服务id调用cms的查询页面接口
    User user = client.findById("5a754adf6abb500ad05688d9");
    System.out.println(user);
 }
}

Feign注意点

SpringCloud对Feign进行了增强兼容了SpringMVC的注解 ,我们在使用SpringMVC的注解时需要注意:
1、feignClient接口 有参数在参数必须加@PathVariable("XXX")和@RequestParam("XXX")
2、feignClient返回值为复杂对象时其类型必须有无参构造函数。

最后修改:2019 年 08 月 25 日 01 : 06 PM
如果觉得我的文章对你有用,请随意赞赏