1 Star 0 Fork 0

张俊发 / demo-cloud

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

Spring-cloud 学习- Eureka

Spring Cloud将Netflix Eureka 拿进来整合了一下,方便Spring Cloud采用Netflix Eureka来做服务注册中心,方便使用; 也就是说 Spring Cloud对 Netflix Eureka做了二次封装。

Eureka Eureka 采用了 C-S(客户端/服务端)的设计架构,也就是 Eureka 由两个组件组成:Eureka服务端和Eureka客户端。 Eureka Server(一个独立的项目)用于注册服务 以及 实现服务的 负载均衡 和 故障转移,它是 服务的 注册中心, 如果我们要将自己的服务注册到Eureka服务上去的话,就要让我们的服务作为Eureka的客户端,而且我们的服务本质上也是一个Springboot的单体项目。

Eureka Client(我们的微服务)它是用于与 Eureka Server交互(我们的服务即Eureka Client客户端与Eureka Server服务端进行交互),获取其上注册的服务(不需要去记住接口地址),使得交互变得非常简单,只需要通过 服务标识 即可拿到服务(其实就是从Eureka Server上获取拿到接口地址,也不需要自己去记住接口地址,即代码层当中的GOODS_SERVICE_URL就不再需要了)。

Spring Cloud中的Eureka 服务注册中心, 实际上也是一个 Spring Boot 工程,

工程架构

 demo-cloud  ———————————————————————————————— 父项目
 ├── eureka-server ----------------------------Eureka的服务端  6091
 ├── eureka-admin -----------------------------Eureka的客户端 8763
 ├── eureka-job -------------------------------Eureka的客户端 8764
 ├── eureka-config ----------------------------Eureka的客户端,也是Config配置中心  8762
 ├── eureka-gateway ----------------------------Eureka网关配置   8765

项目说明

eureka-server-Eureka的服务端

要作为服务端,其实也很简单,因为Springcloud已经给我们封装好了。

  • 我们先在Eureka引入maven
<!--Spring Cloud 的 eureka-server 起步依赖-->
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
 </dependency>
  • 在Eureka-server项目的启动入口类上添加注解
/**
 * @author zhangjunfa
 */
@SpringBootApplication
@EnableEurekaServer   //注册为Eureka的服务端
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }

}
  • 配置yml文件
# 服务端口
server:
  port: 6091
  enable-self-preservation: false                                 
# 应用名称
spring:
  application:
    name: eureka-server
# Eureka配置
eureka:
  instance:
    #设置该服务注册中心的 hostname
    hostname: 127.0.0.1
  client:
    registerWithEureka: false   #注册使用Eureka,设为FALSE,防止自己注册自己
    fetchRegistry: false  #设置为false,表示禁止这种 自己向自己注册的默认行为
    serviceUrl:
      #      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@${eureka.instance.hostname}:${server.port}/eureka/
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

上面的配置完成后。就可以简单的测试了。 这个是我的测试结果

eureka-admin-Eureka的客户端

eureka的客户端和服务端差不多一样的配置,

  • 我们先引入maven
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
  • 然后在Eureka-admin的启动入口做注解
@SpringBootApplication
@EnableEurekaClient   //注解为Eureka的客户端
public class EurekaJobApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaJobApplication.class, args);
    }

}
  • 配置yml文件
server:
  port: 8762
#服务的名称
spring:
  application:
    name: eureka-job

#指定注册中心地址
eureka:
  client:
    serviceUrl:
      defaultZone: http://127.0.0.1:6091/eureka/
  instance:
    prefer-ip-address: true

客户端配置和上面一样, 接下了就可以测试一下啦 注册服务后的测试结果

Eureka服务消费 - Feign

SpringCloud有两种服务调用方式,一种是ribbon+restTemplate,另外一种是feign Feign是一个声明式的伪客户端,它使得写Http客户端变得更简单,使用Feign,只需要创建一个接口并注解。

  • 首先我们在eureka-admin中创建一个测试接口
@RestController
@RequestMapping
public class TestController {
    @GetMapping("/testAdmin")
    public String test() {
        return "我是Eureka服务的消费者,我的名字是eureka-admin";
    }
}
  • 其次我们在eureka-job中消费eureka-admin中的testAdmin接口,我们要在eureka-job中先定义接口
@FeignClient(value = "eureka-admin")
public interface FeignService {
    /**
     * 测试消费Eureka-admin服务中的接口
     *
     * @return java.lang.String
     * @author rosszhang
     * @date 2022/6/16 11:27
     */
    @GetMapping("/testAdmin")
    public String testAdmin();
}
  • 然后我们就可以在eureka-job中使用FeignService
@RequestMapping
@RestController
public class TestController {
    
    //注意此处可能会有一个报错。无法发现feignService这个服务,
    /*Consider defining a bean of type 'com.example.eurekajob.feign.FeignService' in your configuration.*/
    @Autowired
    private FeignService feignService;

    @GetMapping("/findOne")
    public HashMap fineOne() {
        HashMap<String, Object> map = new HashMap<String, Object>();
        map.put("name", "陈");
        map.put("age", "18");
        map.put("address", "天字一号");
        return map;
    }

    @GetMapping("/testConsumerService")
    public String testConsumerService(){
        return feignService.testAdmin();
    }
}

这个错误是因为: 我们要在启动入口添加两个注解:我原先的代码中只添加了一个@EnableEurekaClient,所以会报错。我们只需要添加@EnableFeignClients这个注解就可以解决

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class EurekaJobApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaJobApplication.class, args);
    }

}

然后我们就可以测试一下了。在eureka-job中请求一下 在这里插入图片描述

SpringCloud-config 统一管理配置文件

我们先测试eureka-job服务

  1. 引入Maven
   <!--引入统一配置中心-->
   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-config-server</artifactId>
   </dependency>
  1. 在启动入口添加注解 @EnableConfigServer
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableConfigServer
public class EurekaJobApplication {
   public static void main(String[] args) {
       SpringApplication.run(EurekaJobApplication.class, args);
   }
}
  1. 我们需要在gitte中建立一个仓库,私有的,公共的都可以 如果是私有的就需要加入用户名和密码 此处需要在eureka-job的yml文件中配置一下
#springcloud-config配置----开始
 cloud:
   config:
     server:
       git:
         uri: https://gitee.com/zhang_jun_fa/spring-cloud-config.git
         username: 你的用户名
         password: 你的密码
#springcloud-config配置----结束

具体建立仓库的方法,大家自行百度, 我的gitte配置 这个仓库中只有一个.md和eureka-job.properties文件. eureka-job.properties中我们只加入两个值

name=rosszhang
age=30

然后我们可以测试一下 测试结果

SpringCloud-gateway 网关说明

  1. 网关常见的作用 其常见的作用有:
  • 鉴权校验:验证是否认证和授权
  • 统一入口:提供所有微服务的入口点,起到隔离作用,保障服务的安全性
  • 限流熔断
  • 路由转发
  • 负载均衡
  • 链路追踪
  1. 目前常用的网关
  • SpringCloud Gateway
  • Zuul
  1. 添加pom依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- json -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.78</version>
</dependency>
  1. 跨域请求处理
@Configuration
public class CorsConfig {
    //处理跨域
    @Bean
    public CorsWebFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedMethod("*");
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
        source.registerCorsConfiguration("/**", config);
        return new CorsWebFilter(source);
    }
}
  1. 过滤器
package com.example.eurekagateway.filter;

import com.alibaba.fastjson.JSONObject;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.nio.charset.StandardCharsets;
/**
 * @author zhang
 * @date 2022/9/20
 */
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {


    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("执行了自定义的全局过滤器");
        //1.获取请求参数access-token
        String token = exchange.getRequest().getQueryParams().getFirst("access-token");
        //2.判断是否存在
        if(token == null) {
            //3.如果不存在 : 认证失败
            System.out.println("没有登录");
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete(); //请求结束
        }
        //4.如果存在,继续执行
                return chain.filter(exchange); //继续向下执行
    }

    @Override
    public int getOrder() {
        return 0;
    }

}

延伸阅读

大家可以看看这位大佬的文章:Fengshana

空文件

简介

学习SpringCloud-Eureka服务注册,使用Feign消费服务; 后续添加了从git获取配置文件,SpringCloud-Config的配置中心学习 展开 收起
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/zhang_jun_fa/demo-cloud.git
git@gitee.com:zhang_jun_fa/demo-cloud.git
zhang_jun_fa
demo-cloud
demo-cloud
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891