springCloud2.0搭建

springCloud 环境搭建 GuangZ

Eureka 注册服务搭建:

1:新建springBoot项目,版本选择2.0.4

		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

2:在springAppliction启动类加入@EnableEurekaServer 注册,表示声明这是一个注册服务器。

配置appliction.yml文件

#声明该服务访问端口
server:
  port: 1000 
#声明该服务访问地址
eureka:
  instance:
    hostname: localhost
  client:
    #因为当前这个应用就是eureka服务器,没必要注册自身
    registerWithEureka: false
    #是否从eureka服务器获取注册信息
    fetchRegistry: false
    #查询服务和注册服务都需要依赖这个地址
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

3:启动 springAppliction 访问 服务地址:端口号 。如下则说明注册成功

Eureka添加提供者服务

1:新建springBoot项目,添加依赖:

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

2:配置appliction.yml文件

#声明该服务名称(该服务被调用时会用到),注意名称不要有下划线。
spring:
  application:
    name: product-server
#声明该服务端口号
server:
  port: 2000
#声明注册中心地址,用以将该服务交给注册中心管理
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:1000/eureka/

3:编写业务逻辑:

Controller

@RestController
@RequestMapping("/product")
public class ProductCintroller {
	//从配置文件中获取该服务端口号
    @Value("${server.port}")
    private String port;

    @Autowired
    private ProductService productService;
    
    @RequestMapping("/list")
        public Object list(){
       return productService.list();
    }
    @RequestMapping("/find")
    public Object find(@RequestParam("id")int id){
        Product product = productService.find(id);
        product.setName(product.getName()+"....................."+port);
        return product;
    }
}

Service

public interface ProductService {

    public List<Product> list();

    public Product find(int id);
}

ServiceImpl

@Service
public class ProductServiceImpl implements ProductService {

	//声明一个List 用于时测试存储数据
    private static final List<Product> list = new ArrayList<>();
	//类加载时添加相应数据用于测试
    static {
        Product p1 = new Product(1,"苹果",100,500);
        Product p2 = new Product(2,"香蕉",200,400);
        Product p3 = new Product(3,"机子",300,300);
        Product p4 = new Product(4,"等价物",400,200);
        Product p5 = new Product(5,"例子",500,100);
        list.add(p1);
        list.add(p2);
        list.add(p3);
        list.add(p4);
        list.add(p5);
    }
    @Override
    public List<Product> list() {
        return list;
    }

    @Override
    public Product find(int id) {
        return list.get(id);
    }
}

4:启动springBootAppliction启动类,Eureka注册中心添加该服务

Eureka添加调用者 服务

1:新建SpringBoot项目,添加依赖

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--feign服务调用 @FeignClient -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!--hystrix 熔断器 主要用于 @HystrixCommand-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

2:在springAppliction启动类加入

@EnableFeignClients 表示声明这是一个客户端服务器集成Ribbon(负载均衡)。

@EnableCircuitBreaker 表示加入服务熔断机制

配置appliction.yml文件、

#声明该服务名称
spring:
  application:
    name: order-server
#声明该服务端口
server:
  port: 3000
#注册服务地址
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:1000/eureka/
#开启 feign 自带的 hystrix,用于开启服务调用异常处理
feign:
  hystrix:
    enabled: true

3:当该服务需要调用提供者服务时添加相应服务的 service 接口 @FeignClient

//name:声明需要调用服务名称
//fallback:声明调用服务如果发生异常,处理的类。
@FeignClient(name = "product-server",fallback = ProductFallback.class)
public interface ProductService {
	//该请求参数必须为所要调用服务Controller的url全路径。请求参数也要一样。
    @RequestMapping("/product/find")
    String find(@RequestParam("id") int id);

}

声明服务接口调用异常处理类:如果 ProductService 服务中的某个方法在被调用过程中发成异常会进入此类。 这里可以对错误做一个记入。

//将此类交给springBoot容器处理
@Component
//实现远程服务接口处理类。
public class ProductFallback implements ProductService {
    //重写远程服务接口实现。
    @Override
    public String find(int id) {
        System.out.println(" 在调用 ProductService 下的 find(int id)方法是发生了一个错误 ");
        return null;
    }
}

4:在服务最外层Controller明熔断处理。用以返回给调用者相关结果信息

@RestController
public class OrderController {

    @Autowired
    private OrderService orderService;
    //声明熔断处理方法,如果该处理方法执行过程发生异常则会进入fallbackMethod声明的方法。
    @HystrixCommand(fallbackMethod = "orderFallBack")
    @RequestMapping("/order")
    public Object order(@RequestParam("id")int id,@RequestParam("productId")int productId){
       Order order  = orderService.save(id,productId);
        Map<String,Object> map = new HashMap<>();
        map.put("code","0");
        map.put("msg",order);
        return map;
    }
    
    
    //实现熔断处理方法
    public Object orderFallBack(int id,int productId){
        Map<String,Object> map = new HashMap<>();
        map.put("code","-1");
        map.put("msg","系统繁忙,稍后再试");
        return map;
    }


}

5:在调用方Controller层实现熔断报警机制(采用Redis,TimeUntil)

本地Redis启动:找到Redis安装目录 redis-server 命令

controller层调用服务方法上加   @HystrixCommand(fallbackMethod = "orderFallBack")//声明熔断处理方法

	//Redis  注入
    @Autowired
    private StringRedisTemplate redisTemplate;

    @HystrixCommand(fallbackMethod = "orderFallBack")//声明熔断处理方法
    @RequestMapping("/order")
    public Object order(@RequestParam("id")int id,@RequestParam("productId")int productId){
       Order order  = orderService.save(id,productId);
        Map<String,Object> map = new HashMap<>();
        map.put("code","0");
        map.put("msg",order);
        return map;
    }


//实现熔断处理方法
    public Object orderFallBack(int id,int productId){

        //熔断之后 报警
        String saveOrderKye = "save-order";
        String  sendValue = redisTemplate.opsForValue().get(saveOrderKye);

        //为了效率 新开启一个线程
        //此处采用java新特性lambda开启新线程
        new Thread( ()->{
            //查询缓存中是否有规定的变量如果没有则发消息。
            if (StringUtils.isBlank(sendValue)){
                System.out.println("紧急通知......用户下单失败.....请尽快处理");
                //此处可以添加短信发送服务

                //短信已经发送,为了避免一直重复发送,设置缓存中变量存在时间。
                redisTemplate.opsForValue().set(saveOrderKye,"save-order", 20,TimeUnit.SECONDS);
            }else {
                System.out.println("已经提醒。时间未到");
            }
        }).start();

        Map<String,Object> map = new HashMap<>();
        map.put("code","-1");
        map.put("msg","系统繁忙,稍后再试");
        return map;
    }

appliction.yml文件中添加 hystrix 熔断降级机制

#因为hystrix内部有熔断降级机制,有时候网络延迟的情况下就算被调用的服务正常
#hystrix也会执行熔断。
hystrix:
  command:
    default:
      execution:
        #把hystrix超时关闭:不建议
        #timeout:
          #enabled: false
        #设置超时时间为4秒 默认为1秒
        isolation:
          thread:
            timeoutInMilliseconds: 4000

6、断路器Dashboard监控仪表盘

SpringBootAppliction启动类添加注解 @EnableHystrixDashboard

添加Dashboard监控仪表盘依赖

		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

appliction.yml文件添加仪表盘配置

#配置监控仪表盘
#暴露全部监控信息
management:
  endpoints:
    web:
      exposure:
        include: "*"

访问入口 http://localhost:8781/hystrixHystrix

Dashboard输入: http://localhost:8781/actuator/hystrix.stream

参考资料 默认开启监控配置

https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-security-actuator

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
课程介绍 【完善体系+精品资料】本课程总计115课时,打造全网最全的微服务体系课程;从微服务是什么、能够做什么开始讲起,绝对零基础入门到精通类型。课程整体脉络十分清晰,每个章节一个知识点,画图+源码+运行讲解,不信你学不会。1、课程先讲解了什么是单体架构、什么是微服务架构、他们之间有什么区别和联系,各自有什么优缺点。2、从本质入手,使用最简单的Spring Boot搭建微服务,让你认清微服务是一种思想和解决问题的手段,而不是新兴技术。3、讲解Spring Boot 与 Spring Cloud 微服务架构之间的联系,原生的RestTemplate工具,以及Actuator监控端点的使用。4、带着微服务所带来的各种优缺点,为大家引入服务发现与注册的概念和原理,从而引入我们的第一个注册中心服务Eureka。5、引入负载均衡的理念,区分什么是服务端负载均衡,什么是客户端负载均衡,进而引入Ribbon负载均衡组件的详细使用。6、为了解决微服务之间复杂的调用,降低代码的复杂度,我们引入了Feign声明式客户端,让你几行代码学习服务的远程调用。7、为了解决服务之间的稳定性,避免发生雪崩问题,我们引入了Hystrix断路器,服务降级和熔断机制。8、微服务集群十分庞大,监控起来是十分困难的,尤其是对每一个接口的熔断情况进行监控,因此我们引入了Turbine微服务监控。9、微服务的调用是杂乱无章的,可以网状调用,怎么做到统一的入口出口,统一的授权、加密、解密、日志过滤,我们引入了第一代网关Zuul。10、微服务的配置分散,每次要修改配置都要重启服务,因此我们引入了Config配置中心。11、跟上主流,Consul是当前主流的服务注册与发现、配置中心一体化的解决方案。12、阿里的Nacos服务注册与发现、配置中心在国内炙手可热,Nacos 经历过双十一的微服务中间件。13、Turbin做微服务监控还是太弱,我们需要更强大,可视化,操作性更强的监控系统,因此我引入了Spring Boot Admin体系。14、Zuul已经停止更新支持,Spring Cloud官方推荐的二代网关Spring Cloud Gateway更加强大。15、微服务的安全架构体系虽然复杂,但是是有学习条例的,什么是认证授权、什么是OAuth2.0的原理、 JWT、怎么样去开发实现。 课程资料 【独家资料】1、课程附带全部63个项目源码,其中Hoxton版本项目源码37个,Edgware版本项目26个,2、230页高清PDF正版课件。3、附带nacos、consul、cmder等视频配套软件。学习方法1、每一节课程均有代码,较好的方式为一边听我的讲解,一边使用我提供的项目代码进行观察和运行。2、课程体系庞大,但是并不杂乱,每个章节只针对一个知识点,减轻学习压力。3、坚持每天学习1~2个章节,可以在地铁、公交上用手机学习。【完善知识体系图】

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值