天天看點

Spring Cloud 微服務實戰

服務治理:Spring Cloud Euraka

  • 第一步,搭建服務注冊中心(如果用zk作為注冊中心,類似安裝配置啟動zk)
    注冊中心,我們部署兩套,避免單點(小叢集)
    
    /**
     * @EnableEurekaServer注解啟動一個服務注冊中心提供給其他應用進行對話
     */
    @SpringBootApplication
    @EnableEurekaServer
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
            System.out.println("Spring Cloud Eureka Server1 start success!");
        }
    }
    注冊中心1的application.yml核心配置:
    spring:
      application:
        name: eureka-server
    server:
      port: 8001
    eureka:
      client:
        service-url:
          defaultZone: http://172.16.1.30:8001/eureka  定義注冊中心的位址,服務注冊需要制定
    
    
    @SpringBootApplication
    @EnableEurekaServer
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
            System.out.println("Spring Cloud Eureka Server2 start success!");
        }
    }
    注冊中心2的application.yml核心配置:
    spring:
      application:
        name: eureka-server
    server:
      port: 8001
    eureka:
      client:
        service-url:
          defaultZone: http://172.16.1.31:8001/eureka  定義注冊中心的位址,服務注冊需要制定
    
               

    注冊中心啟動很簡單,重點看下部署了兩台機器,即部署了兩套注冊中心,叢集部署,URL分别是:

    http://172.16.1.30:8001/eureka

    http://172.16.1.31:8001/eureka

  • 第二步,注冊服務提供者
    假設服務已經寫好了,服務需要啟動:
    @SpringBootApplication
    @EnableDiscoveryClient
    @EnableFeignClients
    @EnableHystrix
    @EnableAspectJAutoProxy(exposeProxy = true, proxyTargetClass = true)
    public class ServiceApplication {
        public static void main(String[] args){
            SpringApplication.run(ServiceApplication.class, args);
            System.out.println("Server start success");
        }
    }
    application.yml關注配置:
    spring:
      application:
        name: eureka-provider  #服務名稱
    eureka:
      client:
        service-url:
          defaultZone: http://172.16.1.30:8001/eureka/,http://172.16.1.31:8001/eureka/ 
    指定了服務注冊中心的位址(服務往哪裡注冊,指定的即為上面注冊中心的兩個位址)
    
               
    定義的服務:
    為了友善先建立一個服務提供者和消費者共同使用的接口子產品項目eureka_api,并建立如下接口和請求傳回參數實體類:
    public interface UserInterface {
        @PostMapping("/users")
        String getUserName(String name);
    
        @GetMapping("/msg")
        String getUserMsg(String name);
    }
    
    //定義的服務實作
    @RestController
    public class UserController implements UserInterface {
    
        @Autowired
        private HttpServletRequest request;
    
        @Override
        public String getUserName(String name) {
            return "zhengchao"
        }
    
        @Override
        public String getUserMsg(String name) {
            return "boy,29,married";
        }
    }
    這裡需要注意的是Controller的兩個服務接口中沒有再加PostMapping或GetMapping,因為這個由被實作接口申明了
               
  • 第三步,服務發現

    啟動類:

    @SpringBootApplication
    @EnableDiscoveryClient //消費者用戶端
    @EnableFeignClients //feign用戶端
    public class EurekaConsumerApplication {
        public static void main(String[] args) {
            SpringApplication.run(EurekaConsumerApplication.class, args);
        }
    }           
    使用服務:
    這裡采用fegin僞用戶端的方式來通路我們服務提供端
    @FeignClient(value = "eureka-provider")
    public interface UserService extends UserInterface {
    }
    通過FeignClient來指定調用的服務端應用名稱eureka-provider,這名稱對應注冊在服務中心的Application目錄下 ,在Controller層建立一個響應的輸出UserController并分别提供兩個展示的接口,代碼如:
    @RestController
    public class UserController{
    
        @Autowired
        private UserService userService;
    
        @GetMapping("/users")
        public String getUserName(String name) {
            return userService.getUserName(name);
        }
    
        @GetMapping("/msg")
        public String getUserMsg() {
            return userService.getUserMsg();
        }
    }
    
    application.yml配置:
    eureka:
        client:
          service-url:
            defaultZone: http://172.16.1.30:8001/eureka/,http://172.16.1.31:8001/eureka/            

以上是簡單的服務注冊與服務發現的示例,本文核心是分析SpringCloud作為微服務的原理,包括但不限于說明它的:注冊中心、服務注冊、服務發現、負載均衡、熔斷降級等核心知識~

TODO.....

你可能想知道的一些知識點:

  1. 對于Spring Boot應用,建議啟動程式的包名層次最高,這樣Spring Boot預設自動搜尋啟動程式之下的所有類
  2. 更換Spring Boot預設的啟動端口8080,隻需要調整application.yml中的server.port=9090即可
  3. Spring Boot不需要配置伺服器,因為其内置了比如tomcat
  4. 日志級别設定:
    配置設定:
    logging.level.root=info
    指定某個包下的日志級别:
    logging.level.org=warn
    logging.level.com.aliyun.oss=error           

繼續閱讀