SpringCloud基础知识超超级详细(2)

简介: SpringCloud基础知识超超级详细(2)

Feign

创建一个SpringBoot基础工程,取名feigen-counsumer。并在pom文件中引入必要的依赖内容

<!--    引入父工程-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <projece.reporting.outputEncoding>UTF-8</projece.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.SR2</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
<!--    eureka的依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>2.1.6.RELEASE</version>
        </dependency>
<!--    feign的依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>
    </dependencies>

在引导类上添加@EnableFeignClients注解开启SpringCloud Feignd的支持

//@SpringBootApplication
//@EnableDiscoveryClient
//@EnableCircuitBreaker  //熔断
@SpringCloudApplication //组合注解  熔断+负载+boot启动
@EnableFeignClients  //启用feign组件
public class ConsumerApplication {
    //远程服务间的调用
  /* 使用feigen解决
   @Bean
    @LoadBalanced //开启负载均衡组件
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }*/
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class,args);
    }
}

定义HelloService接口,通过@FeignClient注解指定服务名绑定服务

@FeignClient("service-provider")
public interface HelloService {
    @RequestMapping("/hello")
    String Hello();
}

创建一个ConsumerController来实现对Feign客户端的调用,使用@Autowired直接注入上面的helloService实例

@RestController
public class ConsumerControler {
    @Autowired
    HelloService helloService;
    @RequestMapping(value = "/feign-consumer",method = RequestMethod.GET)
    public String helloConsumer(){
        return helloService.Hello();
    }
}

修改默认配置:端口号,微服务名称,注册给eureka

server:
  port: 9001
spring:
  application:
    name: feign-consumer
eureka:
  client:
    service-url:
      defaultZone: http://localhost:10086/eureka
    register-with-eureka: true #true注册给eureka

测试:


发送几次get请求Http:localhost:9001/feign-consumer,正确返回“hello World”


Zuul

创建一个SpringBoot基础工程,取名SpringCloud-Zuul。并在pom文件中引入必要的依赖内容

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
            <version>2.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>2.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
    </dependencies>

在引导类上添加@EnableZuulProxy注解开启SpringCloud Zuul的支持

@SpringCloudApplication
@EnableZuulProxy //启动zuul组件
public class ZuulApplication {
    public static void main(String[] args) {
        SpringApplication.run(ZuulApplication.class,args);
    }
}

创建LoginFilter继承自ZuulFilter ,添加拦截器的业务代码

@Component
public class LoginFilter extends ZuulFilter {
    /**
     * 过滤器的类型 pre route post error
     * @return
     */
    @Override
    public String filterType() {
        return "pre";
    }
    /**
     * 执行顺序 返回值越小,优先级越高
     * @return
     */
    @Override
    public int filterOrder() {
        return 10;
    }
    /**
     * 是否执行run方法, true
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }
    /**
     * 编写过滤器的业务逻辑
     * @return
     * @throws ZuulException
     */
    @Override
    public Object run() throws ZuulException {
        //初始化context上下文对象
        RequestContext context = RequestContext.getCurrentContext();
        //获取request对象
        HttpServletRequest request = context.getRequest();
        //获取参数
        String token = request.getParameter("token");
        //拦截
        if (StringUtils.isBlank(token)){
            context.setSendZuulResponse(false);
            //提示信息
            context.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);
            //设置相应的提示
            context.setResponseBody("requst error! ");
        }
        //返回值为null,就代表该过滤器什么都不作
        return null;
    }
}

修改默认配置:端口号,微服务名称,注册给eureka

server:
  port: 10010
spring:
  application:
    name: dynamic-zuul
zuul:
  routes:
    service-provider:  /service-provider/**  #路由名称,可以随便写   第三种配置
    # path: /service-provider/** 第一种配置
    # url: http://localhost:8889
    serviceId: service-provider  #  第二种配置
  host:
    connect-timeout-millis: 3000
    socket-timeout-millis: 3000
eureka:
  client:
    service-url:
      defaultZone: http://localhost:10086/eureka

测试:通过网关访问--URL不含token,包含token,打开的界面不一致

image.png

个人总结

Eureka

注册中心:eureka-server


        1.引入启动器


        2配置spring.application.name=dynamic.eureka


        3.在引导类上添加@EnableEurekaServer


客户端:server-provider,server-consumer


       1.引入启动器


       2 配置spring.application.name,eureka.service-url.defaultZone=http://localhost:10086/eureka  


      3.@EnableDiscoveryClient(启动eureka客户端)


Feign

       1.引入openFeign启动器


       2.在引导类上加上@EnableFeignClients


       3.自定义接口,通过@FeignClient注解指定服务名绑定服务


       4.更改默认配置


Zuul

       1.引入Zuul启动器


       2.启动类上添加@EnableZuulProxy注解


       3.创建过滤器,继承ZuulFilter基类,重写四个方法


      4.配置路由  zuul.router. service-provider:  /service-provider/**

相关文章
|
19小时前
|
监控 安全 Java
Spring cloud原理详解
Spring cloud原理详解
8 0
|
5天前
|
消息中间件 负载均衡 Java
【Spring Cloud 初探幽】
【Spring Cloud 初探幽】
13 1
|
6天前
|
Java 开发者 微服务
Spring Cloud原理详解
【5月更文挑战第4天】Spring Cloud是Spring生态系统中的微服务框架,包含配置管理、服务发现、断路器、API网关等工具,简化分布式系统开发。核心组件如Eureka(服务发现)、Config Server(配置中心)、Ribbon(负载均衡)、Hystrix(断路器)、Zuul(API网关)等。本文讨论了Spring Cloud的基本概念、核心组件、常见问题及解决策略,并提供代码示例,帮助开发者更好地理解和实践微服务架构。此外,还涵盖了服务通信方式、安全性、性能优化、自动化部署、服务网格和无服务器架构的融合等话题,揭示了微服务架构的未来趋势。
31 6
|
11天前
|
JSON Java Apache
Spring Cloud Feign 使用Apache的HTTP Client替换Feign原生httpclient
Spring Cloud Feign 使用Apache的HTTP Client替换Feign原生httpclient
|
11天前
|
负载均衡 Java 开发者
Spring Cloud:一文读懂其原理与架构
Spring Cloud 是一套微服务解决方案,它整合了Netflix公司的多个开源框架,简化了分布式系统开发。Spring Cloud 提供了服务注册与发现、配置中心、消息总线、负载均衡、熔断机制等工具,让开发者可以快速地构建一些常见的微服务架构。
|
12天前
|
消息中间件 Java RocketMQ
Spring Cloud RocketMQ:构建可靠消息驱动的微服务架构
【4月更文挑战第28天】消息队列在微服务架构中扮演着至关重要的角色,能够实现服务之间的解耦、异步通信以及数据分发。Spring Cloud RocketMQ作为Apache RocketMQ的Spring Cloud集成,为微服务架构提供了可靠的消息传输机制。
27 1
|
13天前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo: 微服务通信的高效解决方案
【4月更文挑战第28天】在微服务架构的发展中,服务间的高效通信至关重要。Spring Cloud Dubbo 提供了一种基于 RPC 的通信方式,使得服务间的调用就像本地方法调用一样简单。本篇博客将探讨 Spring Cloud Dubbo 的核心概念,并通过具体实例展示其在项目中的实战应用。
15 2
|
13天前
|
监控 Java Sentinel
Spring Cloud Sentinel:概念与实战应用
【4月更文挑战第28天】在分布式微服务架构中,确保系统的稳定性和可靠性至关重要。Spring Cloud Sentinel 为微服务提供流量控制、熔断降级和系统负载保护,有效预防服务雪崩。本篇博客深入探讨 Spring Cloud Sentinel 的核心概念,并通过实际案例展示其在项目中的应用。
23 0
|
13天前
|
Cloud Native Java Nacos
Spring Cloud Nacos:概念与实战应用
【4月更文挑战第28天】Spring Cloud Nacos 是一个基于 Spring Cloud 构建的服务发现和配置管理工具,适用于微服务架构。Nacos 提供了动态服务发现、服务配置、服务元数据及流量管理等功能,帮助开发者构建云原生应用。
20 0