Eureka基础信息
1、基于CS架构,客户端-服务端
2、遵从AP原则(CAP:C-强一致性,A-可用性,p-分区容错性)
3、是Netflix的一个子模块,基于rest服务,用于定位
4、客户端连接服务端后维持一个心跳。
代码实现
总体项目架构:
1、Eureka服务端
1.1导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
</dependencies>
1.2写配置文件application.yml
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com # Eureka服务端服务名称
client:
register-with-eureka: false # 表示是否向注册中心注册自己
fetch-registry: false # false表示自己为服务注册中心
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
# defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ # 集群方式配置
1.3启动类添加注解开启Eureka服务端
@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7001.class, args);
}
}
集群,类似步骤1配置,只需要修改配置文件,服务端互相守望,添加集群配置即可。
2、Eureka客户端
2.1导入依赖
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2.2写配置文件application.yml
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
将客户端注册到eureka服务端中
2.3启动类添加注解开启Eureka客户端
@SpringBootApplication
@EnableEurekaClient
public class PaymentMain8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8001.class,args);
}
}
一、Ribbon+RestTemplate,消费客户端调用
原理:消费者从Eureka获取服务提供者信息,根据负载均衡策略选择发送请求。所以消费者也需要配置Eureka。
说明
消费者,使用了RestTemplate与服务提供者交互。
消费者项目结构:
### 1、添加依赖
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-ribbon -->
<!-- eureka中已经集成了ribbon,可以不用单独添加ribbon依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
2、添加配置(Eureka配置)
server:
port: 80
eureka:
client:
register-with-eureka: false # 不向eureka注册自己
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
3、注解启动
添加注解开启Eureka
@SpringBootApplication
@EnableEurekaClient
public class Consumer80 {
public static void main(String[] args) {
SpringApplication.run(Consumer80.class,args);
}
}
添加注解,使用Ribbon负载均衡
@Configuration
public class ApplicationContexConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
控制层,接口请求
@RestController
public class ConsumerController {\
// 单机版,固定地址
// private static final String HTTP_PATH = "http://localhost:8001";
// 负载均衡(Ribbon),从Eureka注册中心,根据服务id,获取服务器地址
private static final String HTTP_PATH = "http://CLOUD-PROVIDER-SERVICE";
@Autowired
private RestTemplate restTemplate;
@GetMapping("/consumer/get")
public CommonResult<Payment> get(@RequestParam Integer id) {
return restTemplate.getForObject(HTTP_PATH + "/get?id="+id, CommonResult.class);
}
}
二、Feign 接口方式消费客户端调用
结构目录:
1、添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
2、添加配置(Eureka配置)
server:
port: 80
eureka:
client:
register-with-eureka: false # 不向eureka注册自己
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
3、编写Feign接口调用服务端
说明:CLOUD-PROVIDER-SERVICE是Eruka注册中心上的服务提供者的服务名称。
@Component
@FeignClient(value = "CLOUD-PROVIDER-SERVICE")
public interface FeignService {
@GetMapping("/get/{id}")
CommonResult<Payment> getPayment(@PathVariable("id") int id);
@GetMapping("/list")
CommonResult<List> list();
}
4、添加Eureka和Feign注解
添加注解开启Eureka、Feign
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(basePackages = {"com.xiaolu"})
public class ConsumerFeignMain {
public static void main(String[] args) {
SpringApplication.run(ConsumerFeignMain.class,args);
}
}
5、控制层,接口请求
@RestController
public class ConsumerController {
@Autowired
private FeignService feignService;
@GetMapping("/consumer/get/{id}")
public CommonResult<Payment> get(@PathVariable("id") Integer id) {
System.out.println("请求id:"+id);
return feignService.getPayment(id);
}
@GetMapping("/consumer/list")
public CommonResult<List> list() {
System.out.println("查询请求");
return feignService.list();
}
}