Eureka(服务发现框架)的使用

版权声明:欢迎技术爱好者前来讨论,转载请标明出处.谢谢 https://blog.csdn.net/qq_42875051 https://blog.csdn.net/qq_42875051/article/details/88736961

Eureka实现  服务(server) 和  消费(client)

  1. 创建一个springboot项目,不需要选择任何插件

这个是作为一个IDEA项目中父类的存在,没有任何实际意义,可以忽略。

  1. 创建一个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 

  1. 创建一个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 功能

执行之前的语句就可以了。

第二种方法没有进过测试,效果未知。

猜你喜欢

转载自blog.csdn.net/qq_42875051/article/details/88736961