文档章节

springcloud未完

architect刘源源
 architect刘源源
发布于 07/15 18:31
字数 2205
阅读 7
收藏 0

 

1.spring案例开发,注册中心

<maven-jar-plugin.version>2.6</maven-jar-plugin.version>

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.6.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.atguigu.springcloud</groupId>
	<artifactId>cloud-eureka-registry-center</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>cloud-eureka-registry-center</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
		<maven-jar-plugin.version>2.6</maven-jar-plugin.version>
		<spring-cloud.version>Greenwich.SR2</spring-cloud.version>
	</properties>

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

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring-cloud.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

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

</project>

在主入口程序前加注解@EnableEurekaServer

application.yml 

spring:
  application:
    name: cloud-eureka-registry-center
 
server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false #自己就是注册中心,不用注册自己
    fetch-registry: false #要不要去注册中心获取其他服务的地址
    service-url:
       defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

SpringCloud-HelloWorld案例开发-电影服务

用 RestT做远程服务调用

4.1 电影服务
(jar工程,提供查询电影功能)cloud-provider-movie
4.1.1 引入eureka-Discovery、web模块
<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>
4.1.2 创建Movie实体类,增加id,movieName属性
4.1.3 创建MovieDao 
@Repository
public class MovieDao {
public Movie getNewMovie(){
Movie movie = new Movie();
movie.setId(1);
movie.setMovieName("战狼");
return movie; 
}
}
4.1.4 创建MovieService
@Service
public class MovieService { 
@Autowired
MovieDao movieDao; 
public Movie getNewMovie(){
return movieDao.getNewMovie();
} 
}
4.1.5 创建MovieController
@RestController
public class MovieController {
 
@Autowired
MovieService movieService;
 
/**
   * 获取最新电影
   */
@GetMapping("/movie")
public Movie getNewMovie(){
return movieService.getNewMovie();
}
 
}
4.1.6 启动测试
http://localhost:8080,与注册中心无关,注册中心无此服务
4.1.7 编写application.yml
spring:
  application:
    name: cloud-provider-movie
    
server:
  port: 8000  
  
# 指定注册到哪个注册中心
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true #注册自己服务使用ip的方式
4.1.8 将自己自动注册到注册中心@EnableDiscoveryClient
4.1.9 启动注册中心和服务
查看注册中心,访问服务 http://localhost:8000

SpringCloud-HelloWorld案例开发-用户服务
5.1 用户服务
(jar工程,提供查询用户,买电影票功能)cloud-consumer-user
5.1.1 引入eureka-Discovery、web模块
5.1.2 创建User实体类,增加id,userName属性
5.1.3 创建UserDao 
@Repository
public class UserDao {
public User getUser(Integer id){
User user = new User();
user.setId(id);
user.setUserName("张三");
return user;
}
}
5.1.4 创建UserService
拷贝Movie类
@Service
public class UserService {
 
@Autowired
UserDao userDao;
 
public User getUserById(Integer id){
User user = userDao.getUser(id);
return user;
}
 
/**
   * 购买最新的电影票
   * 传入用户id
   */
@HystrixCommand(fallbackMethod="hystrix")
public Map<String, Object> buyMovie(Integer id){
Map<String, Object>  result = new HashMap<>();
//1、查询用户信息
User user = getUserById(id);
//2、查到最新电影票  
result.put("user", user);
result.put("movie", null);//暂时为null
return result;
}
}
5.1.5 创建UserController
@RestController
public class UserController {
 
@Autowired
UserService userService;
 
@GetMapping("/user")
public User getUser(@RequestParam("id")Integer id){
User user = userService.getUserById(id);
return user;
}
 
@GetMapping("/buyMovie")
public Map<String, Object> buyMovie(@RequestParam("id")Integer userid){
Map<String, Object> map = userService.buyMovie(id);
return map;
}
 
}
5.1.6 编写application.yml
spring:
  application:
    name: cloud-consumer-user
    
server:
  port: 9000
  
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true #注册中心保存我的ip
5.1.7 将自己自动注册到注册中心@EnableDiscoveryClient

package com.atguigu.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@EnableDiscoveryClient
@SpringBootApplication
public class CloudConsumerUserApplication {
	@Bean
	public RestTemplate restTemplate() {
		return new RestTemplate();
	};

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

}

5.1.8 启动注册中心和服务,查看注册中心,访问服务
http://localhost:9000/user?id=1 
http://localhost:9000/buyMovie?id=1

package com.atguigu.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@EnableDiscoveryClient
@SpringBootApplication
public class CloudConsumerUserApplication {
	
	@LoadBalanced
	@Bean
	public RestTemplate restTemplate() {
		return new RestTemplate();
	};

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

}

@LoadBalanced   //负载均衡必须加这个

有效果了

如何来做负载均衡呢?

确实是轮着来的,是轮询

刚才在配置中已经配置,那么现在可以取出来用@Value()注解

ribbon加载客户端,也就是消费者上,接下来用ribbon做远程服务调用,重点

 

7.1  Feign声明式调用
7.2  创建新User项目cloud-consumer-user-feign,引入eureka-Discovery、web、Feign模块
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
7.2.1开启@EnableDiscoveryClient服务发现
/**
 * 1、引入feign的starter
 * 2、写一个接口,和被调用的服务关联起来
 * 3、开启Feign功能;@EnableFeignClients
 */
@EnableFeignClients
@EnableDiscoveryClient 
@SpringBootApplication
public class CloudConsumerUserFeignApplication {
public static void main(String[] args) {
SpringApplication.run(CloudConsumerUserFeignApplication.class, args);
}
}
7.2.2 编写application.yml
spring:
  application:
    name: cloud-consumer-user-feign
    
server:
  port: 7000
  
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true #注册中心保存我的ip
7.2.3 复制用户服务项目的代码:实体类,Dao,Service,Controller
7.2.4 将RestTemplate方式改成Feign方式进行远程调用
package com.atguigu.feign;
 
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
 
import com.atguigu.bean.Movie;
import com.atguigu.feign.exception.MovieFeignExceptionHandlerService;
 
/**
 * 调用指定服务名称 “CLOUD-PROVIDER-MOVIE” 的 @GetMapping("/movie") 映射方法
 * 这个方法声明与电影服务端Controller映射的方法声明一致即可。
 */
@FeignClient(value="CLOUD-PROVIDER-MOVIE") //与被调用端的服务名称一致
public interface MovieServiceFeign { 
@GetMapping("/movie")
public Movie getNewMovie(); //与被调用服务端的映射方法一致 
}
7.2.5 修改UserService 代码
@Service
public class UserService {
 
@Autowired
UserDao userDao;
 
//面向接口编程
@Autowired
MovieServiceFeign movieServiceFeign; //调用Feign接口;其实就是调用远程服务
 
/**
 * 购买最新的电影票
 * 传入用户id
   */
public Map<String, Object> buyMovie(Integer id){
Map<String, Object>  result = new HashMap<>();
//1、查询用户信息
User userById = getUserById(id);
//2、查到最新电影票  Feign方式发起远程调用
Movie movie = movieServiceFeign.getNewMovie();
 
result.put("user", userById);
result.put("movie", movie);
return result;
}
}
7.2.6 开启Feign功能@EnableFeignClients
7.2.7 测试调用与负载均衡效果
http://localhost:7000/buyMovie?id=1 

 

feign+ribbon实现负载均衡

第八章 SpringCloud-HelloWorld案例开发-Ribbon+Hystrix组合

8.1 Hystrix服务熔断

目前情况:如果集群的三个电影服务都挂了,会怎样?

服务刚刚都挂掉

服务挂掉有一会了

 

解决:

返回默认数据,会提示错误消息

8.2 使用Ribbon+Hystrix组合:cloud-consumer-user

8.2.1 引入Hystrix

<!--  引入hystrix进行服务熔断 -->

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>

</dependency>

8.2.2 开启断路保护功能@EnableCircuitBreaker

8.2.3 在方法上标注@HystrixCommand(fallbackMethod="xxx")来指定出错时调用xx方法

/**

 * 购买最新的电影票

 * 传入用户id

 */

@HystrixCommand(fallbackMethod="hystrix")

public Map<String, Object> buyMovie(Integer id){

Map<String, Object>  result = new HashMap<>();

//1、查询用户信息

User userById = getUserById(id);

//2、查到最新电影票  restTemplate使用java代码来模拟发请求

Movie movie = restTemplate.getForObject("http://CLOUD-PROVIDER-MOVIE/movie", Movie.class);

 

result.put("user", userById);

result.put("movie", movie);

return result;

}

8.2.4 在本类编写xxx方法,方法的参数和原来一样即可

public Map<String, Object> hystrix(Integer id){

User user = new User();

user.setId(-1);

user.setUserName("未知用户");

 

Movie movie = new Movie();

movie.setId(-100);

movie.setMovieName("无此电影");

 

Map<String, Object>  result = new HashMap<>();

result.put("user", user);

result.put("movie", movie);

return result;

}

8.2.5 测试正常调用&停止user服务,测试异常调用&启动user服务过一段时间测试是否正常

 http://localhost:9000/buyMovie?id=1

8.2.6 熔断器原理

8.2.7 我们悄悄的启动一个服务,刷刷浏览器会怎样?让子弹飞一分钟再看结果

8.3 使用Feign+Hystrix组合:cloud-consumer-user-feign

8.3.1 引入Hystrix

<!--  引入hystrix进行服务熔断 -->

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>

</dependency>

8.3.2 开启断路保护功能@EnableCircuitBreaker

8.3.3 开启FeignHystrix支持

feign:

  hystrix:

    enabled: true #默认false

8.3.4 Feign已经集成了Hystrix,使用起来非常简单@FeignClient(name="provider-user",fallback="异常处理类")

 /*使用Hystrix进行服务的熔断

 * 1)、引入Hystrix的starter

 * 2)、开启xxx功能 :@EnableCircuitBreaker

 * 3)、@FeignClient(value="CLOUD-PROVIDER-MOVIE",fallback=指定这个接口的异常处理类(异常处理类必须实现这个接口))

 */

@FeignClient(value="CLOUD-PROVIDER-MOVIE",fallback=MovieFeignExceptionHandlerService.class)

public interface MovieServiceFeign {

//  未来这个接口就会调用很多方法,定制每一个方法远程出错如何返回兜底mock数据

@GetMapping("/movie")

public Movie getNewMovie();

}

8.3.5 fallback="异常处理类"指定的异常处理类实现这个类的接口即可,并且放在容器中

package com.atguigu.feign.exception;

 

import org.springframework.stereotype.Component;

 

import com.atguigu.bean.Movie;

import com.atguigu.feign.MovieServiceFeign;

 

@Component

public class MovieFeignExceptionHandlerService implements MovieServiceFeign{

 

/**

 * 远程这个方法调用出问题就会调用此方法

 */

@Override

public Movie getNewMovie() {

Movie movie = new Movie();

movie.setId(-100);

movie.setMovieName("无此电影呀...");

return movie;

}

}

8.3.6 测试正常调用&停止user服务,测试异常调用&启动user服务过一段时间测试是否正常

 http://localhost:7000/buyMovie?id=1

 

第九章 SpringCloud-HelloWorld案例开发-Hystrix Dashboard

除了隔离依赖服务的调用以外,Hystrix还提供了近实时的监控,Hystrix会实时、累加地记录所有关于HystrixCommand的执行信息,包括每秒执行多少请求,多少成功多少失败等。Netflix通过hystrix-metrics-event-stream项目实现了对以上指标的监控

9.1 引入actuator(cloud-consumer-user-feign)

<dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-actuator</artifactId>

</dependency>

9.1.1 actuator是用来监控SpringBoot服务的,注意路径问题,具体的版本可能不一样,参考启动日志

9.1.2 可提供的监控服务为

9.2 修改配置文件,暴露数据监控流

management:

  endpoints:

    web:

      exposure:

        include: hystrix.stream # 访问/actuator/hystrix.stream能看到不断更新的监控流

访问/actuator/hystrix.stream 可以看到打印

9.3 引入HystrixDashboard

<dependency>

     <groupId>org.springframework.cloud</groupId>

     <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>

</dependency>

9.4 开启可视化监控功能

9.4.1 @EnableHystrixDashboard

9.4.2 访问当前项目/hystrix,将Hystrixstream地址输入(http://localhost:7000/actuator/hystrix.stream ),点击monitor按钮即可监控

9.4.3 监控中,服务器正常

9.4.4 监控中,服务器重新启动,断路器打开

© 著作权归作者所有

上一篇: svn版本控制
下一篇: 工厂模式
architect刘源源

architect刘源源

粉丝 167
博文 554
码字总数 934264
作品 0
浦东
程序员
私信 提问
史上最简单的 SpringCloud 教程 | 终章

版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接 ,博主地址:http://blog.csdn.net/forezp。 https://blog.csdn.net/forezp/article/details/70148833 转载请标明出处...

方志朋
2017/04/12
0
0
springcloud eureka 服务注册中心

------------------------------------------------------------------------------------------------------------ springcloud (零) springboot 基础 下载 springcloud (一)服务注册中心 ......

curiousby
2017/02/08
0
0
SpringCloud--鸿鹄Cloud分布式微服务云系统

简介 鸿鹄云Cloud是基于SpringCloud来封装的,是一系列框架的有序集合。利用Spring Boot的开发模式简化了分布式系统基础设施的开发,如服务发现、注册、配置中心、消息总线、负载均衡、断路器...

itcloud
2018/07/25
969
0
Spring Cloud-honghu Cloud分布式微服务云系统

简介 鸿鹄云Cloud是基于SpringCloud来封装的,是一系列框架的有序集合。利用Spring Boot的开发模式简化了分布式系统基础设施的开发,如服务发现、注册、配置中心、消息总线、负载均衡、断路器...

itcloud
2018/04/25
494
0
springcloud 服务网关 gateway zuul

------------------------------------------------------------------------------------------------------------ springcloud (零) springboot 基础 下载 springcloud (一)服务注册中心 ......

curiousby
2017/02/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring boot 静态资源访问

0. 两个配置 spring.mvc.static-path-patternspring.resources.static-locations 1. application中需要先行的两个配置项 1.1 spring.mvc.static-path-pattern 这个配置项是告诉springboo......

moon888
今天
3
0
hash slot(虚拟桶)

在分布式集群中,如何保证相同请求落到相同的机器上,并且后面的集群机器可以尽可能的均分请求,并且当扩容或down机的情况下能对原有集群影响最小。 round robin算法:是把数据mod后直接映射...

李朝强
今天
4
0
Kafka 原理和实战

本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/bV8AhqAjQp4a_iXRfobkCQ 作者简介:郑志彬,毕业于华南理工大学计算机科学与技术(双语班)。先后从事过电子商务、开放平...

vivo互联网技术
今天
19
0
java数据类型

基本类型: 整型:Byte,short,int,long 浮点型:float,double 字符型:char 布尔型:boolean 引用类型: 类类型: 接口类型: 数组类型: Byte 1字节 八位 -128 -------- 127 short 2字节...

audience_1
今天
9
0
太全了|万字详解Docker架构原理、功能及使用

一、简介 1、了解Docker的前生LXC LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpa...

Java技术剑
今天
27
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部