专栏首页用户3288143的专栏【SpringCloud】SpringCloud开发课程查询功能

【SpringCloud】SpringCloud开发课程查询功能

文章目录

介绍

技术

之前有用eureka 现在用nacos 工作流和gateway

接口数据流向

数据表

新建项目

新建cloud-删除src-新建modle

Eurak(发现)

Eureka的作用

114、物业 (注册中心、心跳机制60s失效踢除)

没有服务注册于发现可以,但是会引来无穷无尽的麻烦 静态ip变更,影响多服务模块

架构

Eurak Server代码

新建moudle,和业务完全独立 pom依赖,最外层pomcloud版本号 新建配置文件 注解启动

验证http://localhost:8000/

Eureka客户端代码

配置dom 配置properties 启动client

利用Feign实现服务间调用

介绍

历史 netflex -> open (捐给spring cloud)

非常方便 基于接口和注解,和本地方法一样爽的http请求

代码

价格中调用课程服务

引入依赖

<!--       openfeign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

配置文件

#openfeign消费的负载均衡后期再配

加注解

//启动类的客户端
@EnableFeignClients

客户端(在调用类写接口,复制被调用服务的controller方法)

package com.bennyrhys.course.client;

import com.bennyrhys.entity.Course;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.List;

/**
 * @Author bennyrhys
 * @Date 12/27/20 8:04 PM
 * 课程列表的Feign客户端
 */
@FeignClient("course-list")
public interface CourseListClient {
    @GetMapping("/course")
    List<Course> getList();
}

验证pom中(自动引入其他服务的依赖)

controller(在price服务中调用course服务的方法)

验证

利用Ribbon实现负载均衡

修改配置文件

price服务调用course服务的负载均衡设置

#openfeign消费的负载均衡
course-list.ribbon.NFLoadBanlancerRuleClassName=com.netflix.loadbalancer.RoundRobinRule

利用Hystrix实现断路器

比如获取用户信息卡住,但数据库的连接池一直未被释放。系统崩溃 断路器保护,某一处出现问题,保证不影响全部不可用,避免故障蔓延

依赖pom

<!--        断路器 客户端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

配置

#断路器 客户端(默认关闭)
feign.hystrix.enabled=true

启动类注解

@EnableCircuitBreaker

断路器实现类CourseListClientHystrix

package com.bennyrhys.course.client;

import com.bennyrhys.entity.Course;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Component;

/**
 * 描述:     断路器实现类
 */
@Component
public class CourseListClientHystrix implements CourseListClient{

    @Override
    public List<Course> getList() {
        List<Course> defaultCourses = new ArrayList<>();
        Course course = new Course();
        course.setId(1);
        course.setCourseId(1);
        course.setCourseName("默认课程");
        course.setValid(1);
        defaultCourses.add(course);
        return defaultCourses;
    }
}

指明调用服务的断路器类

/**
 * @Author bennyrhys
 * @Date 12/27/20 8:04 PM
 * 课程列表的Feign客户端
 */
@FeignClient(value = "course-list", fallback = CourseListClientHystrix.class)
@Primary //防止调用服务的controller爆红线不好看
public interface CourseListClient {
    @GetMapping("/course")
    List<Course> getList();
}

断路器效果

整合两个服务

将课程列表和课程价格进行整合

返回实体CourseAndPrice

    Integer id;
    Integer courseId;
    String name;
    Integer price;

service

 @Override
    public List<CourseAndPrice> getCoursesAndPrice() {
        List<CourseAndPrice> courseAndPriceList = new ArrayList<>();
        List<Course> courses = courseListClient.courseList();
        for (int i = 0; i < courses.size(); i++) {
            Course course = courses.get(i);
            if (course != null) {
                CoursePrice coursePrice = getCoursePrice(course.getCourseId());
                CourseAndPrice courseAndPrice = new CourseAndPrice();
                courseAndPrice.setPrice(coursePrice.getPrice());
                courseAndPrice.setName(course.getCourseName());
                courseAndPrice.setId(course.getId());
                courseAndPrice.setCourseId(course.getCourseId());
                courseAndPriceList.add(courseAndPrice);
            }
        }
        return courseAndPriceList;
    }
}

通过网关Zuul实现路由功能

两个特点

Zuul集成

新建mudle模块sourse-zuul

引入依赖

<dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

配置文件

spring.application.name=course-gateway
server.port=9000
logging.pattern.console=%clr(%d{${LOG_DATEFORMAT_PATTERN:HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx}
mybatis.configuration.map-underscore-to-camel-case=true
eureka.client.service-url.defaultZone=http://localhost:8000/eureka/

#zuul.prefix=/bennyrhys
zuul.routes.course-list.path=/list/**
zuul.routes.course-list.service-id=course-list
zuul.routes.course-price.path=/price/**
zuul.routes.course-price.service-id=course-price

启动类 注解

package com.bennyrhys.course;

import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

/**
 * 描述:     网关启动类
 */
@EnableZuulProxy
@SpringCloudApplication
public class ZuulGatewayApplication {

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

效果图

实现网关过滤器

过滤前

package com.bennyrhys.course.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;

/**
 * 描述:     记录请求时间
 */
@Component
public class PreRequestFilter extends ZuulFilter {

    @Override
    public String filterType() {
        //过滤器的类型
        return FilterConstants.PRE_TYPE;
    }

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

    @Override
    public boolean shouldFilter() {
        //是否启用过滤器
        return true;
    }

    @Override
    public Object run() throws ZuulException {
        RequestContext currentContext = RequestContext.getCurrentContext();
        currentContext.set("startTime", System.currentTimeMillis());
        System.out.println("过滤器已经记录时间");
        return null;
    }
}

过滤后

package com.bennyrhys.course.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;

/**
 * 描述:     请求处理后的过滤器
 */
@Component
public class PostRequestFilter extends ZuulFilter {

    @Override
    public String filterType() {
        return FilterConstants.POST_TYPE;
    }

    @Override
    public int filterOrder() {
        return FilterConstants.SEND_RESPONSE_FILTER_ORDER - 1;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() throws ZuulException {
        RequestContext currentContext = RequestContext.getCurrentContext();
        Long startTime = (Long) currentContext.get("startTime");
        long duration = System.currentTimeMillis() - startTime;
        String requestURI = currentContext.getRequest().getRequestURI();
        System.out.println("uri:" + requestURI + ",处理时长:" + duration);
        return null;
    }
}

uri:/bennyrhys/list/course,处理时长:919

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:https://blog.csdn.net/weixin_43469680复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • SpringCloud开发框架入门知识

    业务中心:在进行一些庞大的项目设计过程之中,应该有更加完善的业务处理,这样所有的客户端(服务器),用这些业务中心的操作就可以完成具体的功能。

    用户2781897
  • 【程序源代码】Springcloud​开发最佳实践

    系统演进的历程主要分为四个部分,MVC架构》RPC构架》SOA架构》微服务架构,大家可以在网上查一下前三种构架,这里咱们只是重点介绍微服务,此处省略简...

    程序源代码
  • SpringCloud 微服务开发JWT认证流程

    在微服务开发中中我们首先会通过认证中心获取JWT,然后每次发起后端请求都会将JWT放在请求头中,这时候我们后端需要对这个JWT进行验证判断是否合法及是否有对应请...

    JAVA日知录
  • 【程序源代码】SpringCloud敏捷开发系统架构

    基于SpringBoot2.0的后台权限管理系统界面简洁美观敏捷开发系统架构。核心技术采用Spring、MyBatis、Shiro没有任何其它重度依赖。互联网云...

    程序源代码
  • 21.SpringCloud实战项目-后台题目类型功能

    点击类型维护菜单,打开了链接:http://localhost:8002/#/question-type,页面显示空白页面.

    悟空聊架构
  • 【程序源代码】Springcloud微服务开发框架

    MateCloud是一款基于Spring Cloud Alibaba的微服务架构。旨在为大家提供技术框架的基础能力的封装,减少开发工作,让您只关注业务。主体框架...

    程序源代码
  • SpringCloud互联网云快速开发框架

    JeeSpringCloudV3.0-互联网云快速开发框架模块包含定时任务调度、服务器监控、平台监控、异常邮件监控、服务器Down机邮件监控、平台设置、开发平台...

    程序源代码
  • springcloud gateway高级功能之监控metric中tag修改

    springcloud gateway在集成Prometheus后看到监控图中uri是UNKNOWN,如下图:

    一笠风雨任生平
  • 07. SpringCloud实战项目-本地开发环境配置

    java安装和环境变量配置:https://www.cnblogs.com/jackson0714/p/6591942.html

    悟空聊架构
  • 【程序源代码】优秀springcloud微服务开发框架

    基于SpringBoot2.x、SpringCloud和SpringCloudAlibaba并采用前后端分离的企业级微服务多租户系统架构。并引入组件化的思想实现...

    程序源代码
  • SpringCloud分布式开发五大神兽

    IT架构圈
  • 「SpringCloud」搭建企业级开发框架(一)架构说明

    https://www.toutiao.com/i6924236213645820419/

    IT大咖说
  • springcloud gateway高级功能之集成apollo后动态刷新路由

    这里有个坑,如果是没有用到默认的application.properties,这里我们就需要填写namespace了,如下,需要配置value="使用的name...

    一笠风雨任生平
  • SpringCloud+Alibaba微服务讲解,Java自学/进阶程序员必看

    Spring Cloud是目前市面上最火爆的Java微服务技术栈,因其功能丰富涉及微服务管理全面,并且在高可靠、高可阔以及在应对复杂业务和承受并发的能力上发挥出...

    牛仔码农
  • F版本SpringCloud 4—Eureka注册中心开发和客户端开发

    通过前三篇文章,用大白话介绍了微服务和SpringCloud以及服务治理相关的概念,从这篇开始SpringCloud代码的开发。

    鹿老师的Java笔记
  • springcloud gateway高级功能之根据参数自定义路由Predicate

    我们使用了springcloud gateway作为也给路由转发功能,由于历史遗留问题,不仅仅需要根据path转发,还需要根据get或者post中的参数进行转发

    一笠风雨任生平

扫码关注腾讯云开发者

领取腾讯云代金券