目录
3:springcloud原生服务注册组件(Eureka-尤里卡)
1:springcloud组件介绍
为了springcloud的服务管理、服务发布、服务降级、服务网管等问题,springcloud引入了各种组件、用来解决这些问题!
springcloud组件结构如下
不同的服务组件有不同的功能,我们首先学习服务注册组件,服务注册组件主流的有三种
1:Eureka 是 Netflix 开发的,一个基于 REST 服务的,服务注册与发现的组件
2:服务注册组件原理
服务注册组件的原理大概相同,都是有生产者发布服务和消费者消费服务。
生产者的服务在注册中心注册,消费者在注册中心得到服务注册的代理,从而调用服务。
原理图如下:
3:springcloud原生服务注册组件(Eureka-尤里卡)
3.1:Eureka基础知识
Eureka-server:各个服务节点启动之后,会在Eurekaserver中进行服务注册,Eurekaserver可以查看到所有的服务注册节点,服务注册节点可以在管理页面中直观的看到。
Eureka-clinet:这是一个java客户端,简化了与Eurekaserver的交互,客户端有一个内置的轮询的(round-robin)负载均衡算法的负载均衡器,客户端启动之后会在想Eurekaserver每隔30秒钟发送心跳。如果Eurekaserver在多个周期哪没有收到某一个节点的心跳,Eurekaserver会在服务列表中把这个节点删除。
3.2:Eureka单机部署
单机Eurekaservice来管理所有的服务
1:Eureka服务端pom文件
<dependencies>
<!--Spring web 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Springcloud的eureka组件 server-->
<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-actuator</artifactId>
</dependency>
</dependencies>
2:Eureka服务端application 配置文件
#端口号
server.port=8081
#服务端的物理地址
eureka.instance.hostname=eservice1
# 设置是否将自己作为客户端注册到注册中心(缺省true)
#服务端不向service注册自己
eureka.client.register-with-eureka=false
# 设置是否从注册中心获取注册信息(缺省true)
# 因为这是一个单点的EurekaServer,不需要同步其它EurekaServer节点的数据,故设为false
#服务端的作用就是服务中心 管理服务 不用发现服务
eureka.client.fetch-registry=false
#设置地址 服务注册和查询服务依赖这个地址
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
#是否开启自我保护模式,默认为true。
eureka.server.enable-self-preservation=true
#续期时间,即扫描失效服务的间隔时间(缺省为60*1000ms)
eureka.server.eviction-interval-timer-in-ms=10000
#服务续约任务的调用间隔时间,默认为30秒
eureka.instance.lease-renewal-interval-in-seconds=30
3:Eureka服务端启动类
@SpringBootApplication
@ComponentScan(basePackages= {"com.thit"})
@EnableEurekaServer //此注解用来表示这是service
public class Service1Application {
public static void main(String[] args) {
SpringApplication.run(Service1Application.class,args);
}
}
4:Eureka客户端pom
<dependencies>
<!--Spring web 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Springcloud的eureka组件 client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--图形监控信息-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
5:Eureka客户端application
#端口号
server.port=8091
#eureka管理页面显示服务名字 多个相同的服务可以用相同的名字来负载访问
spring.application.name=client
# 设置是否将自己作为客户端注册到注册中心(缺省true)
#服务端不向service注册自己
eureka.client.register-with-eureka=true
# 设置是否从注册中心获取注册信息(缺省true)
# 因为这是一个单点的EurekaServer,不需要同步其它EurekaServer节点的数据,故设为false
#但节点无所谓 多节点必须为true 配合robin的负载均衡
eureka.client.fetch-registry=true
#页面显示ip信息
eureka.instance.instance-id=eureka8091
eureka.instance.prefer-ip-address=true
#设置地址 服务注册和查询服务依赖这个地址 client配置服务端的地址信息
#单机版
eureka.client.serviceUrl.defaultZone=http://localhost:8090/eureka/
6:Eureka服务端启动类
@SpringBootApplication
@ComponentScan(basePackages= {"com.thit"})
@EnableEurekaClient //客户端需要EnableEurekaClient注解
public class Client1Application {
public static void main(String[] args) {
SpringApplication.run(Client1Application.class,args);
}
}
7:启动service和client 我们查看管理页面可以看到服务已经可以查看到了
3.3:Eureka集群
由于单机版的Eureka服务端在实际生产中不够健壮,稳定性能差,我们访问Eureka服务端的时候可能存在系统停机。并且客户端可能是集群部署,所有我们在上面的架构中,改成几圈架构来管理整个项目。新的集群架构如下
1:Eureka服务端8081和8082的application
修改host文件
127.0.0.1 eservice1
127.0.0.1 eservice2
2:Eureka客户端8091和8092的配置
3:启动两个服务端 然后启动两个客户端,页面显示效果如下
4:测试方法需要重新注册一个service服务,采用resttemple来调用服务返回端口号
1:8091和8092 相同的UserController 方法
@RestController
public class UserController {
@Value("${server.port}")
private String port;
@RequestMapping(value = "/add",method = RequestMethod.GET)
public String add(){
System.out.println("端口号:"+port);
return "端口号"+port;
}
}
2:测试方法
@RestController
public class UserController {
//以前的是固定地址
// public static final String URL1="http://localhost:8092/add";
//使用eureka 注册管理服务 使用的是使用eureka地址
public static final String URL1="http://CLIENT/add";
@Autowired
RestTemplate restTemplate1;
@RequestMapping("/test")
public String hello1() {
String a= restTemplate1.getForObject(URL1,String.class);
return a;
}
}
3.4:Eureka微服务信息完善Actuator
1:在管理页面显示物理地址
2:不要主机名字
#页面显示ip信息
eureka.instance.instance-id=自定义名字页面显示可以查看
eureka.instance.prefer-ip-address=true
3.5:Eureka服务发现Discovery
3.6:Eureka自我保护
#是否开启自我保护模式,默认为true。
eureka.server.enable-self-preservation=true
#续期时间,即扫描失效服务的间隔时间(缺省为60*1000ms)
eureka.server.eviction-interval-timer-in-ms=10000
#服务续约任务的调用间隔时间,默认为心跳90秒
eureka.instance.lease-renewal-interval-in-seconds=90