微服务SpringCloud

springCloud的微服务框架具有很多的功能组件:

1 服务治理 eureka 所有工程都可以在eureak中注册自己的服务名称,如果名称一致,将会被eureka作为同一个服务来使用;

2 负载均衡调用组件:ribbon, 前端的客户端的组件

3 接口客户端组件: feign 底层依赖ribbon+template实现的调用。看不到实际调用的方法,利用接口,注解

4 熔断器:Hystrix, 当服务调用出现任何异常或者问题时,可以利用熔断的逻辑完成错误的解决;类似代码中的try catch

5 分布式配置中心:config,分布式配置组件,读取github上的配置文件,实现共享配置;

6 网关组件:zuul,实现网关路由,监听,对当前的需要的服务进行网关治理;

微服务治理组件eureka

springcloud中的核心组件之一,没有它就无法形成微服务的框架;有服务治理中心,有服务注册客户端;

搭建一个服务注册中心(server)

1 springboot工程(quickstart)

2 pom依赖(标准的springboot,但是必须springboot版本1.5.9.Release,和springcloud版本兼容 Edgware)

3 application.properties

server.port=8090

eureka.instance.hostname=localhost //当前中心访问的域名,代号

eureka.client.registerWithEureka=false 

eureka.client.fetchRegistry=false  //当前的注册中心默认情况会在自己启动的中心注册一个自己的服务

eureka.client.serviceUrl.defaultZone=http://localhost:8090/eureka/ //匹配eureka.instance.hostname的值得中心访问地址,服务注册中心的页面可以通过这个地址访问,给其他的服务使用的,浏览器直接访问localhost:8090

3 编写启动类,查看注册中心内容

@SpringBootApplication

@EnableEurekaServer

public class StarterEurekaCenter {

public static void main(String[] args) {

SpringApplication.run(StarterEurekaCenter.class, args);}}

localhost:8090访问测试

 

eureka客户端(服务调用的服务提供者)

 1 quickstart的maven骨架

2 pom依赖

3 application.properites

spring.application.name=service-hi  //eureka中心注册一个service-hi的服务

eureka.client.serviceUrl.defaultZone=http://localhost:8090/eureka/ //指向注册中心,与eureka center一致

 

4 编写启动类(注册服务,利用注解)

@SpringBootApplication

@EnableEurekaClient

public class StarterEurekaClient {

public static void main(String[] args) {

SpringApplication.run(StarterEurekaClient.class, args);

}

}

5 编写一个测试controller

@Value("${server.port}")

private String port;

 

@RequestMapping("hi")

@ResponseBody

public String sayHello(String name){

return "hi,"+name+", i am from port "+port;

}

 

eureka报警

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

 

当提供服务的eureka client断开连接,程序关闭,宕机等问题,导致服务治理中心无法发现或连接通信服务提供者时,可连接的服务提供者占用所有服务提供者的85%(默认值)以下时,出现以上预警

Ribbon组件+restTemplate

实现通过服务调用,完成负载均衡的访问,服务提供者工程代码/数据

 

 

代码

1 quickstart 的骨架

2 pom依赖

3 application.properties

4 启动类

@SpringBootApplication

@EnableDiscoveryClient

public class StarterRibbon {

public static void main(String[] args) {

SpringApplication.run(StarterRibbon.class, args);

}

@Bean

@LoadBalanced //启用负载均衡,做轮训访问

public RestTemplate getRes(){

return new RestTemplate();

}

}

 

5 完成负载均衡的访问

 

Controller 实现服务的调用,调用client01,client02工程的数据,需要实现条用的对象注入,RestTemplate

 1 创建这个RestTemplate,指明它的负载逻辑(Balanced)

2 注入使用

@Autowired

private RestTemplate template;

//测试方法,hi

@RequestMapping("hi")

public String sayHello(String name){

//url访问的服务地址 service-hi

//name=haha  http://service-hi/hi?name=haha

String response = template.getForObject("http://service-hi/hi?name="+name,

String.class);

//response,hi haha, im from 8091/8092

return response;

}

getForObject:将相应中的body实体返回

getForEntity:将相应所有内容封装

postForObject

postForEntity

/*String response = template.getForObject("http://service-hi/hi?name="+name, String.class);*/

 

ResponseEntity<String> entity = template.getForEntity("http://service-hi/hi?name="+name,

String.class);

String response=entity.getBody();

 

6 启动额外的服务提供者,直接注册service-Hi测试访问

eureka-client03直接加入集群,访问的负载均衡可以直接访问;动态添加,其他的结构任何位置都没有发生任何变动

Feign

负载均衡调用服务的客户端组件,声明式(注解)客户端。使得调用更简单(无需关心底层调用的api getForEntity getForObject post..);底层基于ribbon+restTemplate

 

搭建

1 quickstart

2 pom

3 properties

4 启动类

@SpringBootApplication

@EnableDiscoveryClient

@EnableFeignClients

public class StarterFeign {

public static void main(String[] args) {

SpringApplication.run(StarterFeign.class, args);

}

}

 

5 测试代码

问题:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'helloController': Unsatisfied dependency expressed through field 'helloService'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.jt.service.HelloService': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalStateException: RequestParam.value() was empty on parameter 0

 

Controller

@RestController

public class HelloController {

@Autowired

private HelloService helloService;

//测试案例

@RequestMapping("hi")

public String sayHello(String name){

String hello=helloService.sayHello(name);

return "FEIGN:"+hello;

}

}

 

Service

@FeignClient("service-hi")

public interface HelloService {

 

@RequestMapping(value="hi",method=RequestMethod.GET)

String sayHello(@RequestParam(value="name") String name);

}

 

Feign调用后台的服务,service-hi,某个工程宕机,并不影响调用逻辑; Feign天生整合了Hystrix熔断机制

Hystrix

熔断器,容错管理工具,当服务集群中出现任何类似于链接访问异常,或者错误,或者http请求的断开,可以利用熔断的机制完成各种方法的封装,调用方法,实现错误的管理逻辑;

 

错误信息的发送(消息队列)

 

搭建一个ribbon+hystrix的工程

1 quickstart

2 pom

3 application

4 启动类

5测试代码

Controller

@RestController

public class HelloController {

@Autowired

private HelloService helloService;

@RequestMapping("hi")

public String sayHello(String name){

String hello=helloService.sayHello(name);

return "RIBBON:"+hello;

}

}

Service

@Service

public class HelloService {

@Autowired

private RestTemplate template;

//当前方法调用时,抛出的问题,或者异常,可以利用熔断的注解

//实现错误的调用,错误的方法执行错误出现后的逻辑

//fallbackMethod,在当前方法出现问题后,当前类会调用erroHi同名方法

//传递给sayHello的所有参数,会一并交给errorHi处理

@HystrixCommand(fallbackMethod="errorHi")

public String sayHello(String name) {

ResponseEntity<String> entity = template.getForEntity("http://service-hi/hi?name="+name,

String.class);

String response=entity.getBody();

//response,hi haha, im from 8091/8092

 

return response;

}

 

public String errorHi(String name){

//写消息到rabbitmq

//返回当前的错误报信

return "hi,"+name+",sorry error happened";

}}

CONFIG

分布式配置中心

在大量的集群中,各种工程都需要属性的配置properties文件

一旦出现属性的共享,例如redis配置,es配置,数据库配置;各自工程维护起来比较麻烦,而且更新不及时;

微服务框架提供一个共享的分布式配置中心,所有的服务注册者都可以是分布式配置中心的客户端,通过中心管理的github上的配置文件,实现共享配置;

github: 开源的资源,代码,框架,技术分享的网站

和git有个相同的特点,就是资源可以实现回滚和版本控制;

每个不同的用户可以拥有免费的和付费的github资源,使用线下的git向github传递数据;

 

git:软件版本管理器,资源管理器

1 配置中心工程(读取共享的配置文件)

  • quickstart
  • pom
  • applicatin.properties

spring.cloud.config.server.git.uri=https://github.com/xiaoxuwei1986/jtcloud //开元的repository的链接地址,可以直接通过浏览器访问共享资源

spring.cloud.config.server.git.searchPaths=/haha

//共享的repository中可以由多级的路径文件存在

spring.cloud.config.label=master

spring.cloud.config.server.git.username=xiaoxuwei1986

spring.cloud.config.server.git.password=July868713

 

  • 启动类
  • 测试访问

文件名称info-test.properties

info--application

test--profile

 

localhost:8098/{application}/{profile}

 

配置中心就会到github访问application-profile.properties

2 配置的客户端工程(读取中心工程的共享资源)

配置文件

bootstrap.properties

spring.application.name=info //读取配置中心文件文件的前缀application

spring.cloud.config.profile=test //读取前缀profile application-profile.properties

spring.cloud.config.label=master

spring.cloud.config.uri=http://localhost:8098

//配置中心的来源

server.port=8099

 

测试controller

@Controller

public class TestController {

@Value("${spring.redis.nodes}")

private String name;

 

@RequestMapping("test")

@ResponseBody

public String getName(){

return name;

}

}

 

如何修改京淘结构

1 注册中心

2 谁是eureka的客户端(服务的提供者)

控制表格的所有工程都是eureka客户端

3 jsonp无法调用服务,直接访问后台工程

需要修改js代码,实现httpclient方式的服务调用

4 图片上传无法完成

5 bus消息总线(rabbitmq kafka);中心的消息发送者;

 

ZUUL

微服务集群提供的网关,监听等功能的微服务组件;

访问的时候根据url路径,过滤网关拦截的信息,访问指向的服务

1 quickstart

2 pom

3 properties

server.port=8097

spring.application.name=service-zuul

zuul.routes.api-a.path=/api-a/**

zuul.routes.api-a.serviceId=SERVICE-RIBBON-HYSTRIX

//访问并不是直接访问ribbon客户端,feign客户端,而是利用url中域名+端口访问zuul工程,routes.*** 其中*代表的字符串,必须和路由网关的匹配字符串一致,api-a,如果key中的routes.order必须对应匹配的是/order/**

routes.api-a.serviceId指向过滤了网关路由key的地址,访问的服务

 

localhost:8097/api-a/hi?name=haha 访问的是zuul

指向SERVICE-RIBBON-HYSTRIX

http://servic-ribbon-hystrix/hi?name=haha

 

localhost:8097/api-b/hi?name=haha

指向服务SERVICE-FEIGN

http://service-feign/hi?name=haha

zuul.routes.api-b.path=/api-b/**

zuul.routes.api-b.serviceId=SERVICE-FEIGN

4 启动类

@SpringBootApplication

@EnableEurekaClient

@EnableZuulProxy

public class StarterZuul {

public static void main(String[] args) {

SpringApplication.run(StarterZuul.class, args);

}

}

 

5 测试网关转发路由

localhost:8097/api-a/hi

返回结果:

RIBBON:hi null, I am from 8091-8093/error

localhost:8097/api-b/hi

FEIGN: hi null, I am from 8091-8093/白错误页面

//zuul当前测试案例中无法实现后端服务的hystrix的调用。

8091宕机后,通过网关zuul,只能进入错误页面

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值