Eureka实现 服务(server) 和 消费(client)
-
创建一个springboot项目,不需要选择任何插件
这个是作为一个IDEA项目中父类的存在,没有任何实际意义,可以忽略。
-
创建一个springboot项目,配置插件eureka server
这个项目是作为一个server项目,用于担任服务器的角色,其他client项目将会在这个上面进行发布,这个项目创建的时候需要修改配置文件,使本项目不可被扫描。
spring:
application:
name: eurekaserver # 项目名称,这个可以随意
server:
port: 7011 # 指定开放端口,这个也可以随意设定,建议不用1开头的
eureka:
client:
fetch-registry: false # 是否检索服务
register-with-eureka: false # 是否向服务注册中心注册自己
service-url:
defaultZone: http://localhost:7011/ #服务注册中心的配置内容,指定服务注册中心的位置
java启动类添加注解 @EnableEurekaServer
-
创建一个client客户端,向服务器进行注册
创建过程基本相似,区别在于选择的插件为 相同版本下的 web 和 eureka Discovery
spring:
application:
name: userconsumer
server:
port: 7012
eureka:
client:
service-url:
defaultZone: http://localhost:7011/eureka #这个字需要特殊注意,这个是关键词 ,没有这个词控制台会报404错误。
启动类加
@EnableEurekaClient
或
@EnableDiscoveryClient
到此为止一个基本的springboot项目创建成功。
Eureka实现登录验证
接下来增加登录操作限制:
server添加用户验证:
security: #这个需要添加依赖包 如下:
basic:
enabled: true
user:
name: root
password: 123456
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>1.5.19.RELEASE</version>
</dependency>
client端进行登录:
在注册中心地址前加上“用户名 :密码 @”
eureka:
client:
service-url:
defaultZone: http://root:123456@localhost:7011/eureka
这就实现了一个简单的注册
Eureka实现负载均衡
实现负载均衡只需要简单的配置相同的服务器,实现相同的代码,唯一的区别就是需要注册不同的端口号。
spring:
application:
name: feign 这个位置需要一样的
server:
port: 5003 这个位置必须要不一样
eureka:
client:
service-url:
defaultZone: http://localhost:5001/eureka
Eureka的消费者访问生产者,如果不用Feign(声明式rest调用),需要增加一个restTemplate 类别:
package com.mark.springcloud.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* Created by Choisaaaa on 2018/7/7.
* 自定义配置类
*/
@Configuration
public class MyConfig {
@Bean
@LoadBalanced//使用负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
package com.mark.springcloud.controller;
import com.mark.springcloud.entities.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.List;
/**
* Created by Choisaaaa on 2018/7/7.
*
*/
@RestController
@RequestMapping("/consumer/dept")
public class DeptControler_Consumer {
//private static final String REST_URL_PREFIX = "http://localhost:8001";
//MICROSERVICECLOUD-DEP:为Eureka Server中心的微服务实例名称
private static final String REST_URL_PREFIX = "http://MICROSERVICECLOUD-DEPT";
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "/add")
public boolean add(Dept dept) {
return restTemplate.getForObject(REST_URL_PREFIX+"/dept/add",Boolean.class,dept);
}
@RequestMapping(value = "get/{id}")
public Dept get(@PathVariable("id") Long id) {
return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id,Dept.class);
}
@RequestMapping(value = "/list")
public List<Dept> list(){
return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list",List.class);
}
//消费者调用服务发现
@RequestMapping("/discovery")
public Object discovery() {
return restTemplate.getForObject(REST_URL_PREFIX+"/dept/discovery",Object.class);
}
}
resttemplate的两种实现方式:
get请求:
.getForEntity 和 getForObject 两种方式
他们都提供了三种重载:
▪️getForObject(String url, Class responseType, Object ... urlVariables)
▪️getForObject(String url, Class responseType, Map urlVariables)
▪️getForObject(URI url, Class responseType)
post请求:
▪️postForEntity(String url, Object request, Class responseType, Object... uriVariables)
▪️postForEntity(String url, Object request, Class responseType, Map uriVariables)
▪️postForEntity(URI url, Object request, Class responseType)
postForLocation : 该方法实现了以POST请求提交资源,并返回新的资源的URI。
▪️postForLocation(String url, Object request, Object... uriVariables)
▪️postForLocation(String url, Object request, Map uriVariables)
▪️postForLocation(URI url, Object request)
下面为实现方式:
RestTemplate restTemplate = new RestTemplate();
User user = new User("didi","30");
URI uri = restTemplate.postForLocation("http://USER-SERVER/user",user);
这个虽然是通过eureka实现的客户端的负载均衡,但是在注解@Loadbalance中还是继承了ribbon的实现方法。所以这个的根本上就是通过 ribbon实现的。
Eureka server的高可用性
通过构建一个eureka server集群实现注册中心的高可用性。
构建eureka server集群有两个方法:一种是通过构建多个eureka server 并建立集群 ,第二种是通过单个实例,不同配置文件实现集群(伪集群)。
第一种:通过配置多个eureka server 构建集群
首先创建一个eureka server 并通过测试可以实现注册服务。
第二,将第一个eureka server进行拷贝之后,创建第二个server。(修改启动类和配置文件)
spring:
application:
name: eureka 这个名字需要是一样的
eureka:
instance:
hostname: peer 这个位置设置不同的hostname如果相同的hostname,注册上就会被覆盖。
prefer-ip-address: false
client:
service-url:
defaultZone: http://127.0.0.1:4001/eureka,http://localhost:4000/eureka 向其他注册中心进行注册
fetch-registry: false
register-with-eureka: false
server:
port: 4005 这个端口号不能是一样的
以此类推,后面的依照上面的配置就可以了。
第二种,通过不同的配置文件,启动同一个eureka server 的jar包
通过下面的方法进行启动:
java -jar eureka-server-1.0.0.jar --spring.profiles.active=peer2 这个是配置文件中指定的名字
项目文件中配置两个配置文件:(加上原先的就是三个配置文件) application-peer1.properties appplication-peer2.properties
第一个:
server.port=1111
eureka.instance.hostname=peer1
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://peer2:1112/eureka/
eureka.server.enable-self-preservation=false
第二个:
server.port=1112
eureka.instance.hostname=peer2
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://peer1:1111/eureka/
eureka.server.enable-self-preservation=false
也可以写成一个文件:
spring:
application:
name: eureka-cluster
---
spring:
profiles: master 启动的时候要用的名字
server:
port: 8761
eureka:
instance:
hostname: master
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://backup:8762/eureka
---
spring:
profiles: backup 启动的时候要用的名字
server:
port: 8762
eureka:
instance:
hostname: backup
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://master:8761/eureka
修改本机host文件
192.168.31.11 master
192.168.31.11 backup
启动之前需要先将eureka server 进行打包 : maven功能下的 package 功能
执行之前的语句就可以了。
第二种方法没有进过测试,效果未知。