Skip to content

zengzw/spring-cloud

Repository files navigation

springClound

spring-eureka 服务注册中心

  • application.properties 配置 在application.properties 做相关配置。 在默认设置下,该服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为

     server.port=1111  #端口
     eureka.client.register-with-eureka=false
     eureka.client.fetch-registry=false
     eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/	
    
  • applicaiton 入口

@EnableEurekaServer //启动服务注册中心
@SpringBootApplication
public class RegisterApplication {

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

  • POM 文件
	<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-eureka-server</artifactId>
	</dependency>

spring-eureka-service 服务提供者

  • 配置
#配置服务实例的名字,在后续的调用中,可以直接通过该名字对此服务进行访问
spring.application.name=compute-service
#指定服务实例的访问端口
server.port=2222
#指定要注册到上面的服务注册中心的位置
eureka.client.serviceUrl.defaultZone = http://localhost:1111/eureka/	
  • application.properties 配置文件
#配置服务实例的名字,在后续的调用中,可以直接通过该名字对此服务进行访问
spring.application.name=compute-service
#指定服务实例的访问端口
server.port=2222
#指定要注册到上面的服务注册中心的位置
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:1111/eureka/
  • Application 入口
@EnableDiscoveryClient //该注释能激活DiscoveryClient的实现,实现controller中的信息输出
@SpringBootApplication
public class ServiceApplication {

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

  • POM 文件
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>

服务消费者 spring-cloud-robin-client

Ribbon

  • 简介

    • Ribbon是一个基于HTTP和TCP客户端的负载均衡器。
    • Ribbon可以在通过客户端中配置的ribbonServerList服务端列表去轮询访问以达到均衡负载的作用。
    • 当Ribbon与Eureka联合使用时,ribbonServerList会被DiscoveryEnabledNIWSServerList重写, 扩展成从Eureka注册中心中获取服务端列表。同时它也会用NIWSDiscoveryPing来取代IPing,它将职责委托给Eureka来确定服务端是否已经启动。
  • POM jar包

	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-ribbon</artifactId>
	</dependency>
  • service代码
@Service
public class ComputeService {
    
    @Autowired
    RestTemplate template;
    
    @HystrixCommand(fallbackMethod = "addServiceFallback") //开启熔断
    public String addService() {
        return template.getForEntity("http://COMPUTE-SERVICE/add?a=10&b=20", String.class).getBody();
    }
    
    public String addServiceFallback() {
        return "error";
    }
}
  • Application 程序入口
@EnableDiscoveryClient //该注释能激活DiscoveryClient的实现,实现controller中的信息输出
@SpringBootApplication
@EnableCircuitBreaker //注解开启断路器功能:
public class ClientApplication {

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

  • appliaction.properties 配置文件
spring.application.name=ribbon-consumer
server.port=3333
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:1111/eureka/

spring-cloud-feign-clinet 客户端

Feign

  • 简介

    • Feign是一个声明式的Web Service客户端,它使得编写Web Serivce客户端变得更加简单。
    • 我们只需要使用Feign来创建一个接口并用注解来配置它既可完成。它具备可插拔的注解支持,包括Feign注解和JAX-RS注解
    • Spring Cloud为Feign增加了对Spring MVC注解的支持,还整合了Ribbon和Eureka来提供均衡负载的HTTP客户端实现
  • POM jar包

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
  • 服务代码
@FeignClient(value="compute-service",fallback=ComputeClientHystrix.class) //fallback 熔断支持
public interface ComputeService {

    @RequestMapping(method = RequestMethod.GET, value = "/add")
    Integer add(@RequestParam(value = "a") Integer a, @RequestParam(value = "b") Integer b);
}
  • Application 入口
@EnableDiscoveryClient //该注释能激活DiscoveryClient的实现,实现controller中的信息输出
@SpringBootApplication
@EnableFeignClients //@EnableFeignClients注解开启Feign功能,
public class FeignClientApplication {

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

  • application.properties 配置
pring.application.name=feign-consumer
server.port=3334
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:1111/eureka/

Netflix Hystrix 断路器

  • 简介

    • Spring Cloud中使用了Hystrix 来实现断路器的功能。
    • Hystrix是Netflix开源的微服务框架套件之一,该框架目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。
    • Hystrix具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包,以及监控和配置等功能。
  • 在eureka-ribbon的主类RibbonApplication中使用@EnableCircuitBreaker注解开启断路器功能:

@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public class RibbonApplication {
	@Bean
	@LoadBalanced
	RestTemplate restTemplate() {
		return new RestTemplate();
	}
	public static void main(String[] args) {
		SpringApplication.run(RibbonApplication.class, args);
	}
}
  • 在使用ribbon消费服务的函数上增加@HystrixCommand注解来指定回调方法。
@Service
public class ComputeService {
    @Autowired
    RestTemplate restTemplate;
    @HystrixCommand(fallbackMethod = "addServiceFallback")
    public String addService() {
        return restTemplate.getForEntity("http://COMPUTE-SERVICE/add?a=10&b=20", String.class).getBody();
    }
    public String addServiceFallback() {
        return "error";
    }
}

spring-config-server 配置文件服务

  • 说明

    • Spring Cloud Config为服务端和客户端提供了分布式系统的外部化配置支持
    • 配置服务器为各应用的所有环境提供了一个中心化的外部配置。
    • Spring Cloud Config也提供本地存储配置的方式。
      我们只需要设置属性spring.profiles.active=native,Config Server会默认从应用的src/main/resource目录下检索配置文件。
      也可以通过spring.cloud.config.server.native.searchLocations=file:F:/properties/属性来指定配置文件的位置。
      虽然Spring Cloud Config提供了这样的功能,但是为了支持更好的管理内容和版本控制的功能,还是推荐使用git的方式。
  • pom.xml中引入spring-cloud-config-server

<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-config-server</artifactId>
</dependency>
  • applicaiton 入口 @EnableConfigServer注解,开启Config Server
@EnableConfigServer
@SpringBootApplication
public class Application {
	public static void main(String[] args) {
		new SpringApplicationBuilder(Application.class).web(true).run(args);
	}
}
  • application.properties 中配置服务信息以及git信息
spring.application.name=config-server
server.port=7001
# git管理配置
spring.cloud.config.server.git.uri=http://git.oschina.net/didispace/SpringBoot-Learning/  #配置git仓库位置
spring.cloud.config.server.git.searchPaths=Chapter9-1-4/config-repo #配置仓库路径下的相对搜索位置,可以配置多个
spring.cloud.config.server.git.username=username
spring.cloud.config.server.git.password=password
  • 验证

    • URL与配置文件的映射关系如下:
    • /{application}/{profile}[/{label}]
    • /{application}-{profile}.yml
    • /{label}/{application}-{profile}.yml
    • /{application}-{profile}.properties
    • /{label}/{application}-{profile}.properties
      上面的url会映射{application}-{profile}.properties对应的配置文件,{label}对应git上不同的分支,默认为master

spring-client-server 配置文件客户端

  • pom 文件
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
  • bootstrap.properties
#对应前配置文件中的{application}部分
spring.application.name=didispace
#对应前配置文件中的{profile}部分
spring.cloud.config.profile=prod
#对应前配置文件的git分支
spring.cloud.config.label=master
#配置中心的地址
spring.cloud.config.uri=http://localhost:7001/

注意:属性必须配置在bootstrap.properties中,因为config配置会先于application.properties。bootstrap 先于 application

  • Controller 使用
    后在需要自动更新配置变量的Java类上,使用注解 @RefreshScope 修饰。@Value 来获取值
@RefreshScope
@RestController
class TestController {
    @Value("${from}")
    private String from;
    @RequestMapping("/from")
    public String from() {
        return this.from;
    }
}

spring-zuul 服务网关

简介

  • Zuul的主要功能是路由和过滤器。路由功能是微服务的一部分。包括一下功能
  • Authentication
  • Insights
  • Stress Testing
  • Canary Testing
  • Dynamic Routing
  • Service Migration
  • Load Shedding
  • Security
  • Static Response handling
  • Active/Active traffic management
  • pom 文件
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
  • application 入口
@EnableZuulProxy //注解开启Zuul
@SpringCloudApplication //整合了@SpringBootApplication、@EnableDiscoveryClient、@EnableCircuitBreaker
public class Application {
	public static void main(String[] args) {
		new SpringApplicationBuilder(Application.class).web(true).run(args);
	}
	
	@Bean
	public AccessFilter accessFilter() {
		return new AccessFilter();
	}
	
}
  • applicaiton.properties 配置文件
spring.application.name=api-gateway
server.port=5555

# routes to url 
zuul.routes.api-a-url.path=/api-a-url/**
zuul.routes.api-a-url.url=http://localhost:2222/

zuul.routes.api-a.path=/api-a/**
zuul.routes.api-a.serviceId=service-A
zuul.routes.api-b.path=/api-b/**
zuul.routes.api-b.serviceId=service-B
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/


其中api-a-url 是自己定义的,可以随意。请求的话,是path -> url的映射。

  • 服务过滤
  • 在服务网关中定义过滤器只需要继承ZuulFilter抽象类实现其定义的四个抽象函数就可对请求进行拦截与过滤。
public class AccessFilter extends ZuulFilter{

   private static Logger log = LoggerFactory.getLogger(AccessFilter.class);
   
   @Override
   public Object run() {
       RequestContext ctx = RequestContext.getCurrentContext();
       HttpServletRequest request = ctx.getRequest();
       log.info(String.format("%s request to %s", request.getMethod(), request.getRequestURL().toString()));
       Object accessToken = request.getParameter("accessToken");
       if(accessToken == null) {
           log.warn("access token is empty");
           ctx.setSendZuulResponse(false);
           ctx.setResponseStatusCode(401);
           return null;
       }
       log.info("access token ok");
       return null;
   }

   
   /**
    * 返回一个boolean类型来判断该过滤器是否要执行,所以通过此函数可实现过滤器的开关。在上例中,我们直接返回true,所以该过滤器总是生效。
    */
   @Override
   public boolean shouldFilter() {
       // TODO Auto-generated method stub
       return true;
   }

   /**
    * 通过int值来定义过滤器的执行顺序
    */
   @Override
   public int filterOrder() {
       // TODO Auto-generated method stub
       return 0;
   }

   
   /**
    * pre:可以在请求被路由之前调用
       routing:在路由请求时候被调用
       post:在routing和error过滤器之后被调用
       error:处理请求时发生错误时被调用
 */
   @Override
   public String filterType() {
       return "pre";
   }

}

  • filterType生命周期 avatar

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages