服務劃分

weixin_34054866發表於2018-09-20

微服務列表

  • 購物車
  • 登入驗證
  • 產品

叢集列表

  • web叢集:ribbon客戶端負載均衡,請求來自於硬體負載F5或者nginx,(本機執行)
  • Eureka Server叢集,3例項192.168.0.117~192.168.0.119,埠號10000
  • 微服務叢集:整合Eureka Client
    • 購物車微服務3例項192.168.0.117~192.168.0.119,服務命名micro-cart
    • 登入驗證微服務3例項192.168.0.117~192.168.0.119,服務命名micro-login
    • 產品微服務3例項192.168.0.117~192.168.0.119,服務命名micro-product
  • redis叢集(暫時單機)
  • mysql主備(暫時單機)
  • 全域性配置中心

Eureka Server叢集

server:
  port: 10000
eureka:
  instance:
    hostname: 192.168.0.119
  client:
    serviceUrl:
      defaultZone: http://192.168.0.117:10000/eureka/,http://192.168.0.118:10000/eureka/,http://192.168.0.119:10000/eureka/
server:
  port: 10000
eureka:
  instance:
    hostname: 192.168.0.118
  client:
    serviceUrl:
      defaultZone: http://192.168.0.117:10000/eureka/,http://192.168.0.118:10000/eureka/,http://192.168.0.119:10000/eureka/
server:
  port: 10000
eureka:
  instance:
    hostname: 192.168.0.117
  client:
    serviceUrl:
      defaultZone: http://192.168.0.117:10000/eureka/,http://192.168.0.118:10000/eureka/,http://192.168.0.119:10000/eureka/

編譯後用如下分別用以下命令執行jar檔案,執行時指定spring.profiles.active引數,spring.profiles.active的用法可以自行百度

java -jar ~/spring-cloud-example/Spring-cloud-eurekaserver/target/Spring-cloud-eurekaserver-0.0.1-SNAPSHOT.jar --spring.profiles.active=euraka117
java -jar ~/spring-cloud-example/Spring-cloud-eurekaserver/target/Spring-cloud-eurekaserver-0.0.1-SNAPSHOT.jar --spring.profiles.active=euraka118
java -jar ~/spring-cloud-example/Spring-cloud-eurekaserver/target/Spring-cloud-eurekaserver-0.0.1-SNAPSHOT.jar --spring.profiles.active=euraka119

登入驗證微服務實現

  • 程式碼:https://gitee.com/steveGuRen/spring-cloud-example/tree/master/Spring-cloud-micro-CardRecord
    三個配置檔案如下:application-117.yml~application-119.xml,分別對應IP地址192.168.0.117到119的配置
    整合了Eureka client和server的依賴,由於是登入驗證服務,所以用redis來儲存session,將狀態儲存在儲存叢集,目前還是單機,微服務繼續保持無狀態(stateless),從而能夠輕易的進行水平擴充套件
    spring session的註解配置以及redis的註解配置還有datasource的註解配置可以檢視com.example.demo.config裡面的3個配置類

  • 下面的程式碼關鍵的是用了@EnableDiscoveryClient註解,用於將該專案spring mvc的@RequestMapping對應的服務地址註冊到Eureka server叢集

package com.example.demo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@MapperScan("com.example.demo")
@EnableDiscoveryClient
public class SpringCloudMicroCardRecordApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudMicroCardRecordApplication.class, args);
    }
}
  • 下面的程式碼使用spring session儲存session,實際上spring session只要引用相關的依賴配置好redis的相關配置即可,難度不高。
@Controller
@RequestMapping("/account")
@ResponseBody
public class AccountController {
    
    @Autowired
    private RedisService redisService;
    @Autowired
    private AccountService accountService;
    
    private String PRIFIX_USER_SESSION = "PRIFIX_USER_SESSION";
    
    @RequestMapping(value = "login", method = RequestMethod.POST)
    
    public ResourceSupport login(HttpServletRequest request, String username, String password) {
        Account accont = accountService.login(username, password);
        ResultResource result = new ResultResource();
        if (accont != null) {
            //TODO  save login info to redis and return
            String key = PRIFIX_USER_SESSION + ":" + accont.getName() + ":name";
            request.getSession().setAttribute(key, accont.getName());
            result.setSuccess(true);
            return result;
        } else {
            //TODO return failed result
            result.setSuccess(false);
            return result;
        }
    }

    
}

  • Eureka叢集和微服務叢集都啟動後,可以看到instances currently registered with Eureka裡面有兩個例項,例項名實際上顯示的是yml裡面配置的spring.application.name的名字,然後還能看到對應的數量以及對應的服務例項地址,按f12瀏覽器除錯可以看到裡面暴露的具體訪問地址
1815061-e8a96beb030bfb5d.png
image.png

Web叢集

  • 程式碼:https://gitee.com/steveGuRen/spring-cloud-example/tree/master/Spring-cloud-web
    剩下的就是web叢集了,web叢集、微服務叢集、Eureka server叢集的關係如下圖,由於只是模擬,所以Web叢集和微服務叢集的ip地址是一樣的,Web叢集使用Ribbon客戶端負載均衡

    1815061-6ab3d2dcb60e3f0a.png
    架構圖

  • 首先使用RestTemplate作為請求微服務的框架,Ribbon通過一個加上了@LoadBalanced註解的RestTemplate物件來實現負載均衡

@SpringBootApplication
@EnableDiscoveryClient
public class SpringCloudWebApplication {

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(SpringCloudWebApplication.class, args);
    }
}

  • 通過http://[服務名稱大寫]/[服務地址]的格式,可以使用restTemplate諸如postForEntity的方法實現微服務的遠端請求,Ribbon預設會以輪詢的方式去進行將請求分配到不同的微服務例項上面去
@RestController
public class SimpleController {

    @Autowired
    RestTemplate restTemplate;
    
    @RequestMapping(value = "/account/login", method = RequestMethod.POST)
    @ResponseBody
    public String login(Account loginInfo) {
        ResponseEntity<String> response = restTemplate.postForEntity("http://MONO-ESHOP-MICRO-LOGIN/account/login", loginInfo, String.class);
        return response.getBody();
    }
}

  • aplication.yml配置
server:
  port: 8081
  servlet:
    context-path: /
  tomcat:
    uri-encoding: UTF-8

eureka:
  client:
    serviceUrl:
      defaultZone: http://192.168.0.117:10000/eureka/,http://192.168.0.118:10000/eureka/,http://192.168.0.119:10000/eureka/
      
      
spring:
  application:
    name: web
  redis:
    host: 192.168.0.117
    port: 6379
    password: 

相關文章