sringcloud 练习(一)

一、简述

简单应用及问题整理。
版本:Dalston.SR5
不同版本差异描述

二、 简单server样例

案例采用maven工程。
父类pom.xml

   <parent> 
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.13.RELEASE</version>
        <relativePath/>
    </parent>

子类pom.xml

	<dependencies>
	    <dependency>
	        <groupId>org.springframework.cloud</groupId>
	        <artifactId>spring-cloud-starter-eureka-server</artifactId>
	    </dependency>
	</dependencies>
	
	<dependencyManagement>
	    <dependencies>
	        <dependency>
	           <groupId>org.springframework.cloud</groupId>
	           <artifactId>spring-cloud-dependencies</artifactId>
	           <version>Dalston.SR5</version>
	           <type>pom</type>
	           <scope>import</scope>
	        </dependency>
	    </dependencies>
	</dependencyManagement>  

启动类

@EnableEurekaServer	
@SpringBootApplication
public class App 
{
	public static void main(String[] args) {
		SpringApplication.run(App.class, args);
	}
}

启动有报错,不必理会。

在这里插入图片描述

三、服务注册与发现

euraka 常用配置说明

1. 注册中心高可用

为了模拟高可用,在系统C:\Windows\System32\drivers\etc下hosts文件中添加:
127.0.0.1 eureka1
127.0.0.1 eureka2
两个中心相互注册(defaultZone),服务提供方注册到两个注册中心。
注册服务中心一:
application.yml

server:
  port: 8001
eureka: 
  instance:
    hostname: eureka1
    lease-renewal-interval-in-seconds: 10   ##定义服务续约任务(心跳)的调用间隔,单位:秒
    lease-expiration-duration-in-seconds: 120 ##定义服务失效的时间,单位:秒(该时段内未收到心跳则失效)
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://eureka2:8002/eureka/  ##互相注册到对方--高可用服务发现  

服务提供方(自己随便弄个controller即可):
application.yml

spring:
  application: 
    name: producer-service

server:
  context-path: /producer
  port: 7001
  
eureka:
  client:
    service-url:
      #高可用配置,服务提供方需配置所有注册服务中心,以逗号分隔。
      defaultZone: http://eureka1:8001/eureka/,http://eureka2:8002/eureka/

启动类:

@EnableEurekaClient
@SpringBootApplication
public class Producer 
{
	public static void main(String[] args) {
		SpringApplication.run(Producer.class, args);
	}
}

运行结果:
在这里插入图片描述
在这里插入图片描述
停掉一个:
在这里插入图片描述
在这里插入图片描述

2. 添加消费者

添加依赖

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

启动类

@EnableDiscoveryClient	
@SpringBootApplication
public class Consumer 
{
	@Bean
	@LoadBalanced //负载均衡
	public RestTemplate restTemplate() {
		return new RestTemplate();
	}
	public static void main(String[] args) {
		SpringApplication.run(Consumer.class, args);
	}
}

c类

@Autowired
	private RestTemplate restTemplate;
	
	@RequestMapping(value = "/test", method = {RequestMethod.GET})
	public String hello(){
		ResponseEntity<String> reponse = restTemplate.getForEntity("http://producer-service/producer/hello", String.class);
		return reponse.getBody();
	}

配置

spring:
  application: 
    name: consumer-service

server:
  context-path: /consumer
  port: 7002
  
eureka:
  client:
    service-url:
      defaultZone: http://eureka1:8001/eureka/,http://eureka2:8002/eureka/  

在这里插入图片描述

3. feign

修改消费者
启动类:
@EnableFeignClients
注解:


		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-feign</artifactId>
		</dependency>  
@FeignClient("producer-service")
//@FeignClient(name="producer-service", fallback = FeignServiceHystrixFallback.class)
public interface FeignService {
	@RequestMapping(value = "/hello", method = { RequestMethod.GET })
	String hello();
}

c类

@Autowired
	FeignService feignService;

	@RequestMapping(value = "/test", method = { RequestMethod.GET })
	public String test() {
		return feignService.hello();
	}

在这里插入图片描述

4. 重试机制

依赖

	    <dependency>
	    	<groupId>org.springframework.retry</groupId>
	    	<artifactId>spring-retry</artifactId>
	    </dependency>	

配置

  cloud: 
    loadbalancer:
      retry:
        enabled: true   ##启用重试机制

producer-service: 
  ribbon:
    OkToRetryOnAllOperations: true #是否对所有的请求都进行重试
    MaxAutoRetriesNextServer: 1  # 重试时切换实例的次数
    MaxAutoRetries: 5  #最大重试次数,在该次数内进行实例切换

启动类
@EnableRetry

	@Bean
	//通过prefix  指定配置所在位置,或者通过setConnectionRequestTimeout进行设置
	public HttpComponentsClientHttpRequestFactory httpComponentsClientHttpRequestFactory(){
		
			HttpComponentsClientHttpRequestFactory httpComponentsClientHttpRequestFactory = new 	   HttpComponentsClientHttpRequestFactory();
		httpComponentsClientHttpRequestFactory.setConnectionRequestTimeout(1000);
		httpComponentsClientHttpRequestFactory.setConnectTimeout(1000);
		httpComponentsClientHttpRequestFactory.setReadTimeout(3000);
		return new HttpComponentsClientHttpRequestFactory();
	}
	
	@Bean
	@LoadBalanced
	public RestTemplate restTemplate(){
		return new RestTemplate(httpComponentsClientHttpRequestFactory());
	}

再添加两个producer,各提供一个相同的服务,一个睡眠时间设置大于3s,一个正常访问,以此模拟重试场景。

5. 熔断

##断路器超时时间:
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 10000


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

使用@HystrixCommand设置降级方法,忽略异常,时间设置等。

@HystrixCommand(fallbackMethod = "callHelloFailback")
	public String callHello() {
		return restTemplate.getForObject("http://producer-service/hello", String.class);
	}
	
	public String callHelloFailback(){
		return "降级策略";
	}

四、参考

参考资料:
springCloud资料1
Finchley 升级问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值