springCloud微服务学习总结

SpingCloud微服务学习总结

  1. 首先springCloud是基于springboot来构建的,应该先了解springboot的特征。
  2. eureka用来管理服务register与discovery,构建microService比较简单,只需要@EnableEurekaServer,@EnableEurekaClient两注解。
  3. spingCloud的熔断机制Circuit。
  4. 统一的服务实例监控软件,@EnableHystrixDashboard
  5. 服务client的负载均衡Ribbon,RestTemplate底层通过Ribbon来实现load balance的访问server。
  6. Zookeeper在springCloud中集成,通过apache Curator的开源client,Zookeeper能支持服务注册与发现。但我只使用zookeeper的分布式configuration。

7.我的springCloud 代码工程例子:https://git.oschina.net/andrexu2015/mindSpringCloudMicroDemo,欢迎下载。

### 1. spingBoot简单介绍

package com.calm.b;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.context.annotation.ImportResource;

@Configuration
@ComponentScan("com.calm.*")
@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)
@ImportResource(value = {"applicationContext.xml"})
@EnableAspectJAutoProxy
public class BizApplication {

  /**
   * 程序的启动入口
   * 
   * @param args
   */
  public static void main(String[] args) {
    // SpringApplication.run(BizApplication.class, args);
    new SpringApplicationBuilder(BizApplication.class).web(true).run(args);
  }
}

构建spingboot工程,只需要在所有package目录最根层建立一个main方法class,配上@Configuration,@ComponentScan,@EnableAutoConfiguration注解就能够启动springBoot程序,@SpringBootApplication是前三个注解默认配置的。
1. @Configuration 代表该component是一个spring容器定义的配置bean。
2. @ComponentScan 代表spring容器需要扫表java组件包路径范围。默认是当前class所有在包位置。
3. @EnableAutoConfiguration 启动自动获取配置的开关,exclude是指可以在排除需要的configuration bean。

2. eureka的discovery与register

  1. @EnableEurekaServer 代表服务管理的服务方,在main class上添加注册,参考例子cloud-eureka-server。
  2. 它提供管理界面,http://localhost:8761/
  3. @EnableEurekaClient 客户端则使用这个注解,参考例子cloud-simple-service。
  4. server与client 的bootstrap.properties配置如下:
#service discovery url
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
  1. eureka客户端与服务端之间交互应该知道其原理,EurekaClient 类是其主要组件,可以获取server端的所有注册信息,例子代码:
@RequestMapping(value = "/monitor")
    public void getDishSetmealGroup(HttpServletRequest request, HttpServletResponse response)
            throws ServletRequestBindingException {
        InstanceInfo instanceInfo = discoveryClient.getNextServerFromEureka("cloudSimpleService", false);
        System.out.println(instanceInfo.getHealthCheckUrl());
        serviceUrl();
    }

    public String serviceUrl() {
        // discoveryClient.geti
        List list = discoveryClient.getInstancesById("my-THINK:cloudSimpleService:8082");
        if (list != null && list.size() > 0) {
            System.out.println(list.get(0).getHomePageUrl());
        }
        Application application = discoveryClient.getApplication("cloudSimpleService");
        list = application.getInstances();
        if (list != null && list.size() > 0) {
            System.out.println(list.get(0).getHealthCheckUrl());
        }
        return null;
    }
  1. 通过eureka服务端可以,http://localhost:8761/eureka/apps可以查看一个xml结构式所有注册信息
<instanceId>my-THINK:cloudSimpleService:8082instanceId>
<hostName>my-THINKhostName>
<app>CLOUDSIMPLESERVICEapp>
<ipAddr>192.168.7.197ipAddr>
<status>UPstatus>
<overriddenstatus>UNKNOWNoverriddenstatus>
<port enabled="true">8082port>
<securePort enabled="false">443securePort>
<countryId>1countryId>
<dataCenterInfo class="com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo">
    <name>MyOwnname>
dataCenterInfo>

7.参考如下http://www.tuicool.com/articles/JBbU3mY ,描述EurekaClient的注册过程。

3. Circuit熔断器例子

参考spring 官方文档

4. HystrixDashboard使用介绍

参考spring 官方文档

5. Ribbon负载均衡的例子

  1. 我们通过RestTemplate来构建负载均衡,@LoadBalanced 标志
@Configuration
public class BeanConfiguration {

    @LoadBalanced
    @Bean
//  @Order()
    public RestTemplate restTemplate(){
        return new  RestTemplate();
    }
}
@Service("usserService")
public class UserService {

    @Resource
    private RestTemplate restTemplate;

    private static final Logger logger = LoggerFactory.getLogger(UserService.class);

    final String SERVICE_NAME = "cloudSimpleService";


//  @HystrixCommand(fallbackMethod = "fallbackSearchAll")
    public List  searchAll() {
        logger.info("====================================");
        List users=null;
        try{
            users=restTemplate.getForObject("http://" + SERVICE_NAME + "/user", List.class);
        }catch(Exception e){
            e.printStackTrace();
        }
        logger.info("====================================");
        return users;
    }


    public List  searchAllTwo() {
        logger.info("====================================");
        List users=null;
        try{
            users=restTemplate.postForObject("http://" + SERVICE_NAME + "/user",null, List.class);
            //restTemplate.exchange(url, method, requestEntity, responseType)
            //restTemplate.delete(url);
        }catch(Exception e){
            e.printStackTrace();
        }
        logger.info("====================================");
        return users;
    }

主要通spring.application.name=cloudSimpleService 名字+url来访问具体的服务。

6. zookeeper分布式配置信息集成。

  1. 这个只介绍zookeeper与springCloud集成的分布式配置。
  2. 分两种配置基于服务实例之上的全局配置,基于服务的自己配置。
  3. 基于zookeeper,zkui服务的的配置结构如下:

springCloud微服务学习总结_第1张图片

springCloud微服务学习总结_第2张图片

  1. 要注意zkui配置文件node结构,

dev –代表自己的环境
– apps:customized – 所有appInstance配置
– cloudSimpleService –测试的服务应用
— —该app自己的属性定义

#App Config Dashboard (ACD) dump created on :Wed Nov 02 15:09:00 CST 2016
/configurations/mind/dev/apps=foo=bar
/configurations/mind/dev/apps:customized=foo=bar
/configurations/mind/dev/apps:customized/customized=age=22222222222
/configurations/mind/dev/apps:customized/customized=foo=bar
/configurations/mind/dev/cloudSimpleService=foo=bar
/configurations/mind/dev/cloudSimpleService/customized=foo=bar
/configurations/mind/dev/cloudSimpleService/customized=password=1wswddewwpassword
/configurations/mind/dev/cloudSimpleService/customized=userName=user12345andrex
/configurations/mind/dev/cloudSimpleService/mysqldb=foo=bar
/configurations/mind/dev/tradeAnalyzer=andrexu2=11
/configurations/mind/dev/tradeAnalyzer=foo=bar
/configurations/mind/dev/tradeAnalyzer=testUserNode=12433
  1. 服务端的配置如下:
#service name
spring.application.name=cloudSimpleService

spring.profiles.active=dev,datasource,mail,customized
# zookeeper所有集群address
spring.cloud.zookeeper.connectString=testzk1.shishike.com:2181,testzk2.shishike.com:2181,testzk3.shishike.com:2181
#是否开启zookeeper使用
spring.cloud.zookeeper.config.enable=true
#zokkeeper配置的根目录
spring.cloud.zookeeper.config.root=/configurations/mind/dev
spring.cloud.zookeeper.config.defaultContext=apps
spring.cloud.zookeeper.config.profileSeparator=:
  1. 使用springBoot配置与bean映射功能,测试get属性是否能获取zookeeper配置的值。
@Component
@ConfigurationProperties(prefix="customized")
public class CustomizedProperties {
    //@NotNull
    private String userName;
    //@NotNull
    private String password;

    private String age;

    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }

}

你可能感兴趣的:(microServi,spring,netflix,spingCloud,微服务例子,spingBoot)