eurka组成
- eurka服务端,是提供各个模块的使用之间的注册发现的,eurka的默认是将自己的的服务和ip地址也注册到自己的服务中。
- eurka客户端, 是将自己的模块服务注册到注册中心去。
eurka模块之间的调用:各个模块建自己注册到了服务端之间,客户端和服务端之间会有一个通信机制,通过心跳包的方式向服务端发送心跳机制。默认时间是30m一次。如果服务端检测到了链接失败,就会将该模块从注册中心删除。如果是删除的数量超过了85%,有可能是网络延迟的原因,注册中心就不会再将模块删除,是挂起不再提供服称之为无效服务。等待重新连接成功后再把数据发送给调用端,通过配置可以改变他们之间的心跳时间和eurka服务端的自我保护功能。
1. 注册中心
使用注解得方式来确定服务中心(@EnableEurekaServer)
package com.kusen.eurker.server;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* 注册中心
* 配置eurker中心
* 开启服务注册中心
*/
@EnableEurekaServer
@SpringBootApplication
public class ServerApplication {
public static void main(String[] args) {
SpringApplication.run(ServerApplication.class, args);
}
}
server.port: 8761
eureka:
instance:
hostname: eureka-server # eureka实例的主机名
client:
register-with-eureka: false #是否将自己注册到注册中心去 默认是为true
fetch-registry: false #是从注册中心获取自己的信息, 默认是true
service-url:
defaultZone: http://localhost:8761/eureka/ #定义服务中心的地址
2. 服务提供者
1. 服务提供者controller(rest风格)的方式来提供服务。
2.将自己的服务注册到服务中心去
package com.kusen.proveder.controller;
import com.kusen.proveder.service.TicketService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
//controller
@RestController
public class TicketController {
@Autowired
TicketService ticketService;
@GetMapping("/ticket")
public String getTicket(){
return ticketService.getTicket();
}
}
package com.kusen.proveder.service;
import org.springframework.stereotype.Service;
/**
* 将服务注册到服务中心去
*/
@Service
public class TicketService {
public String getTicket() {
System.out.println("8002");
return "《厉害了,我的国》";
}
}
启动类
package com.kusen.proveder;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 服务的提供者
*/
@SpringBootApplication
public class ProvederApplication {
public static void main(String[] args) {
SpringApplication.run(ProvederApplication.class, args);
}
}
配置文件
spring:
application:
name: provider
server:
port: 8088
#eureka 的服务注册中心 服务的提供者
eureka:
instance:
prefer-ip-address: true # 注册服务的时候使用服务的ip地址
client:
service-url:
defaultZone: http://localhost:8761/eureka/ #将服务注册到服务中心去
3. 消费者
1.需要使用注解类来引用服务(@EnableDiscoveryClient )
2.需要通http的方式来调用服务的方法;调用的方式是http://模块名称或服务的端口/要调用服务端方法名称
package com.kusen.customer.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class UserController {
@Autowired
RestTemplate restTemplate;
@GetMapping("/buy")
public String buyTicket(String name){
String s = restTemplate.getForObject("http://localhost:8088/ticket", String.class);
return name+"购买了"+s;
}
}
启动类
package com.kusen.customer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
/**
* 服务的消费者
*/
@EnableDiscoveryClient //开启发现服务功能
@SpringBootApplication
public class CustomerApplication {
public static void main(String[] args) {
SpringApplication.run(CustomerApplication.class, args);
}
//@LoadBalanced //使用负载均衡机制
@Bean
public RestTemplate restTemplate(){//使用spring模板发送http请求获取服务调用者
return new RestTemplate();
}
}